2016-03-08 5 views
1

Это мои ошибки кода/valgrind. Может кто-нибудь помочь мне выяснить, где я ошибаюсь.Получение ошибок valgrind при попытке освободить массив int pointer. Не знаю, почему

struct Stores{ 
    int storeNumber; 
    int *itemCost; 
} Stores; 

Stores store; 
store = calloc(1,numStores*sizeof(store)); 

store.itemCost = (int*) calloc(1, numItems*sizeof(int)); //(numItems = 2) 

store.itemCost[0] = 10; 
store.itemCost[1] = 10; 

free(store.itemCost); <---- Error here 
free(store); 

Ошибка Valgrind Я получаю:

--Invalid read of size 8 
+0

__Пожалуйста, не редактируйте, чтобы изменить вопрос, как только у вас есть ответ .__ Вы всегда можете указать ___add___ дополнительную информацию, сохраняя исходный вопрос без изменений. –

+0

Более идиоматический код 'store.itemCost = calloc (sizeof * store.itemCost, numItems);' – chux

+0

при назначении возвращаемого значения из 'calloc()' получатель уступки должен быть указателем, а не экземпляром структуры , поэтому в этой строке есть две проблемы: «Магазин хранит;» 1) «Магазины» - это «неполный тип», поэтому он не будет компилироваться. 2) приемник указателя должен быть указателем. Предложите: 'struct Stores * store;' – user3629249

ответ

2

Прежде всего, без typedef на месте,

Stores store; 

неправильно. Stores не является тип, во всяком случае.

Учитывая

typedef struct Stores{ 
    int storeNumber; 
    int *itemCost; 
} Stores; 

, а затем

Stores store; 

вам не нужно (скорее, не может) calloc(), вообще.

В случае, если вы хотите играть с выделения динамической памяти, вам необходимо изменить

Stores *store; // a pointer 

и соответствующие операторы доступа члена от . к ->, как это применимо.

Мораль истории: Включите предупреждения компилятора и обратите внимание на них.

Это означает, что для первого calloc() вы не произвели возвращенное значение, не делайте этого в следующий раз.

+0

Извините, моя ошибка, так или иначе пропустила *. –

+0

@ J.Doe Nopes, вы этого не сделали. Тогда 'store.itemCost' не будет компилироваться. –

+0

Это именно то, что у меня есть:/и моя программа работает нормально. Это просто ошибка valgrind. –