URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 8170
[ Назад ]

Исходное сообщение
"Проблема с указателями ;("

Отправлено Ivanoff , 23-Мрт-09 19:04 
Доброго времени суток!
Есть некоторый код:
...

void SomeFunct(struct RGB_s **Matrux)
{
   ...
   Matrux = malloc(sizeof(struct RGB_s)*headerInfo.height);
    
     if(Matrux==NULL)
       {
        printf("errr"); return -4;
       };

     for(i=0;i<headerInfo.height;i++)
       {
     Matrux[i] =  malloc(sizeof(struct RGB_s)*headerInfo.width);
         if(Matrux[i]==NULL)
            {
          // printf("errrR"); return -4;
            };    
       };
  
    ...
};

int main()
{
   struct RGB_s **Matrux;
  
    SomeFunct(Matrux);

    тут при обращении к полям Matrux программа валится в core.
    

  return 0;
};

Вопросы:
1. Почему так происходит?
2. Как исправить?


Содержание

Сообщения в этом обсуждении
"Проблема с указателями ;("
Отправлено gaa , 23-Мрт-09 19:28 
>1. Почему так происходит?

Потому что указатель изменяется только внутри SomeFunct.

>2. Как исправить?

Либо передавать указатель на Matrux в SomeFunct (т.е. struct RGB_s ***), либо возвращать значение для Matrux из SomeFunct.

И почитать всё же главу про указатели из учебника по программированию.


"Проблема с указателями ;("
Отправлено Ivanoff , 23-Мрт-09 20:12 
>
>Либо передавать указатель на Matrux в SomeFunct (т.е. struct RGB_s ***), либо
>возвращать значение для Matrux из SomeFunct.

Подскажите тогда как выделить память если передавать указатель на Matrux в функции SomeFunct

вот так не работает:

void SomeFunct(struct RGB_s ***Matrux)
{
   ...
    *Matrux = (struct RGB_s **)malloc(sizeof(struct RGB_s)*headerInfo.height);
    
     if(Matrux==NULL)
       {
        printf("errr"); return -4;
       };

     for(i=0;i<headerInfo.height;i++)
       {
     (*Matrux)[i] = (struct RGB_s *) malloc(sizeof(struct RGB_s)*headerInfo.width);
         if(Matrux[i]==NULL)
            {
          // printf("errrR"); return -4;
            };    
       };
   ...
};

>И почитать всё же главу про указатели из учебника по программированию.

Читал, но все же ястности нет ;(



"Проблема с указателями ;("
Отправлено gaa , 23-Мрт-09 21:16 
>>Либо передавать указатель на Matrux в SomeFunct (т.е. struct RGB_s ***), либо
>Подскажите тогда как выделить память если передавать указатель на Matrux в функции
>SomeFunct

#include <stdio.h>
#include <stdlib.h>

struct RGB_s {
    int r,g,b;
};

struct headerInfoSt {
    int height;
    int width;
} headerInfo;

void SomeFunct(struct RGB_s ***Matrux_)
{
    // здесь была ошибка с типом создаваемого значения. строка должна быть типа struct RGB_s*
    struct RGB_s **Matrux = (struct RGB_s**)malloc(sizeof(struct RGB_s*)*headerInfo.height);

    // возвращаем значение "наружу"
    *Matrux_ = Matrux;

    if(Matrux==NULL)
    {
        printf("errr"); //return -4;
    };

    int i;
    for(i=0;i<headerInfo.height;i++)
    {
        Matrux[i] =  malloc(sizeof(struct RGB_s)*headerInfo.width);
        if(Matrux[i]==NULL)
        {
            // printf("errrR"); return -4;
        };    
    };
}

int main () {
    headerInfo.height = 2;
    headerInfo.width = 3;
    struct RGB_s **m;
    SomeFunct(&m);

    return 0;
}

>>И почитать всё же главу про указатели из учебника по программированию.
>Читал, но все же ястности нет ;(

Это азбука. Так что читай до просветления.


"Проблема с указателями ;("
Отправлено михаил , 23-Мрт-09 19:59 
>1. Почему так происходит?

Проверь изменяется ли Matrux после вызова SomeFunct? Передача параметра по значению.

>2. Как исправить?

Не передавать параметр по значению если интересен результат его изменения в функции.

Например функция может вернуть значение.


"Проблема с указателями ;("
Отправлено Alexx , 24-Мрт-09 03:43 
что у тебя в matrux -  элементы или указатели ?
ну неважно ...

  факт тот, что адрес, полученный от malloc в функции
  надо отдать обратно main-у

  типа так, если я правильно понял, что тебе нужно:

int main()
{
   struct RGB_s *Matrux;  // это пока неинициализированный ptr
                          
   rc = Somefunc(&Matrux);  // отдаем его адрес, ф-я должна выделить память и
                            //  инициализировать наш указатель

   dosomething(Martux[zzz]->field_of_your_struct);
}


int Somefunc (struct RGB_s **Matrux)  // ptr to ptr
{
   // для удобства можно завести локальный указатель
    struct RGB_s *Temp;

    Temp = malloc(....);           // отхапали память
    if (Temp == NULL) { .....};

    *Matrux = Temp;                //  отдаем адрес отхапанной памяти  main-у

    // теперь делай что хочешь с этой памятью - хоть тут, хоть в main

}