Я делаю массив структур для динамического выделения списка продуктов, но это работает только несколько раз (3 ~ 5 раз), а затем я получил эту ошибку.C - realloc с массивом структур
* Ошибка в `./test ': перераспределить(): недействительный следующий размер: 0x000055bc0b44f260 *
Вот мой код, это часть работы колледжа.
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int cod;
float price;
} Product;
int main() {
FILE *fp;
fp = fopen("products.txt", "r+");
if(fp == NULL)
fopen("products.txt", "w+");
int control = 1;
int choice;
int tam = 0;
int i;
Product *p1;
p1 = malloc(sizeof(Product));
while(fread(&p1[0], sizeof(Product), 1, fp) != NULL){
tam++;
}
if(tam > 1){
rewind(fp);
p1 = malloc((tam) * sizeof(*p1));
for (int i = 0; i < tam; i++){
fread(&p1[i], sizeof(Product), 1, fp);
}
}
rewind(fp);
do {
printf("1 - Add product\n2 - Show all products\n3 - Exit\n-> ");
scanf(" %d", &choice);
switch (choice) {
case 1:
if (tam == 0) {
//p1 = malloc(sizeof(Product));
printf("Digit the product code: ");
scanf(" %d", &p1[tam].cod);
printf("Digit the product price: ");
scanf(" %f", &p1[tam].price);
tam++;
} else {
printf("***Realloqing: %d***\n", tam * sizeof(*p1));
p1 = (Product*)realloc(p1, (tam) * sizeof(Product));
for (i = tam; i > 0; i--) {
p1[i].cod = p1[i-1].cod;
p1[i].price = p1[i-1].price;
}
printf("Digit the product code: ");
scanf(" %d", &p1[0].cod);
printf("Digit the product price: ");
scanf(" %f", &p1[0].price);
tam++;
}
break;
case 2:
for (i = 0; i < tam; i++) {
printf("Product code: %d\nProduct price: %f\n", p1[i].cod, p1[i].price);
}
break;
case 3:
control = 0;
break;
}
} while (control);
for (int i = 0; i < tam; i++){
fwrite(&p1[i], sizeof(Product), 1, fp);
}
fclose(fp);
free(p1);
return 0;
}
Несколько вещей: во-первых вы не должны назначить обратно к указателю вы передаете 'realloc', если' realloc' терпит неудачу и возвращает нулевой указатель, вы потеряете исходный указатель и имеет утечку памяти. Затем вы должны прочитать [эту дискуссию о литье 'malloc' (и друзей)] (http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc/605858). –
Что касается вашей проблемы, кажется, что вы пишете границы вашей памяти. Возможно, вы захотите использовать такой инструмент, как [Valgrind] (http://valgrind.org/), чтобы помочь вам найти такие проблемы. –
'fopen (" products.txt "," w + ");' -> 'fp = fopen (" products.txt "," w + ");' –