Доброго времени суток!
Есть некоторый код:
...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. Как исправить?
>1. Почему так происходит?Потому что указатель изменяется только внутри SomeFunct.
>2. Как исправить?
Либо передавать указатель на Matrux в SomeFunct (т.е. struct RGB_s ***), либо возвращать значение для Matrux из SomeFunct.
И почитать всё же главу про указатели из учебника по программированию.
>
>Либо передавать указатель на 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;
};
};
...
};>И почитать всё же главу про указатели из учебника по программированию.
Читал, но все же ястности нет ;(
>>Либо передавать указатель на 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;
}>>И почитать всё же главу про указатели из учебника по программированию.
>Читал, но все же ястности нет ;(Это азбука. Так что читай до просветления.
>1. Почему так происходит?Проверь изменяется ли Matrux после вызова SomeFunct? Передача параметра по значению.
>2. Как исправить?
Не передавать параметр по значению если интересен результат его изменения в функции.
Например функция может вернуть значение.
что у тебя в 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
}