Центральная проблема может быть лучше всего описана двумя выдержками из вашего кода:
temp = realloc(*tab, (*PicCounter) *sizeof(*temp));
[...]
**tab = temp;
Выперераспределяя пространство, на которое указывает значение *tab
, но в случае успеха вы сохраняете указатель на новое пространство в **tab
, , которое является другим местоположением .Независимо от того, какое из них является правильным местом для указателя, комбинация определенно неправильная.
На самом деле, однако, учитывая способ, которым вы вызываете свою функцию ...
struct Picture *tabofpics;
[...]
AddPicture(&tabofpics,&piccounter);
... тип фактического аргумента struct Picture **
.И это подходит для ваших целей, поэтому вы должны настроить определение функции, чтобы оно соответствовало:
int AddPicture(struct Picture **tab, int *PicCounter)
.Кроме того, вы должны убедиться, что соответствующее объявление функции присутствует в заголовочном файле, который находится #include
d в исходном файле, содержащем определение AddPicture
, и во всех исходных файлах, содержащих вызов этой функции.Это, плюс обеспечение включения предупреждений компилятора, должно дать возможность компилятору помочь вам диагностировать несоответствия между определением и использованием этой функции.
После этого выражение *tab
в функции AddPicture()
будет ссылаться на тот же объект, на который ссылается выражение tabofpics
(no *
) в main()
.Похоже, это согласуется с тем, как вы на самом деле используете его, за исключением несоответствия, которое я описал в начале.
Есть и другие разумные критические замечания по поводу вашего кода, которые могут быть сделаны, но @Iharob ужепроделал хорошую работу, обращаясь к тем, кто в своем ответе.