Это не то, как вы увеличиваете массив.
Сначала
Rechnung++;
в порядке, но Rechnung
больше не является указателем, возвращаемым предыдущим вызовом malloc
или realloc
. Так что вы не можете ни realloc
, ни free
это.
Во-вторых,
Rechnung = realloc(Rechnung,1*sizeof(Ware));
хорошо, если вы хотите оставить размер массива всегда равным 1 элементу, несмотря ни на что. Если вы хотите, чтобы размер увеличился, вам нужно указать новый размер.
Типичный цикл роста массива часто выглядит так:
Data *array = NULL; // note it's fine to realloc a NULL
size_t size = 0;
while (fgets(...)) {
size_t new_size = size + 1;
Data *new_array = realloc(array, sizeof(Data) * new_size);
if (new_array == NULL) {
// report an error, exit, abort, try again, whatever
// note having a separate `new_array` variable allows you
// to retain old data in `array` in the case of `realloc` erroring on you
} else {
array = new_array;
array[size].foo = make_foo();
array[size].bar = make_bar();
size = new_size;
}
}
Обратите внимание, что вы никогда не увеличиваете array
, потому что вы не можете передать увеличенное значение array
в realloc
. Вы также не можете иметь что-то вроде этого:
Data *array = malloc(sizeof(Data));
Data *current = data;
while (...) {
...
current->foo = make_foo();
current->bar = make_bar();
array = realloc(array, sizeof(Data) * new_size);
current++;
}
, поскольку realloc
может и будет возвращать указатель, отличный от того, который был передан, и current
станет недействительным. Поэтому используйте обычную индексацию скучных массивов.