Я хочу динамически добавлять новые элементы в массив структур. Я добавил минимальный пример того, что segfaults. Я думаю, что мне нужно передать указатель struct data **arr
функции перераспределения и добавить новый элемент правильно, но я не смог сделать это правильно.Изменить размер массива структур внутри функции
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
struct data {
char s[10];
int arr[10];
};
void add_one_element(struct data *arr, int *num_elements)
{
/*increment counter*/
*num_elements +=1;
arr = realloc(arr, *num_elements * sizeof(struct data));
strcpy(arr[*num_elements-1].s, "ABC");
for(int i = 0; i < 10; i++)
arr[*num_elements-1].arr[i] = i;
}
int main()
{
struct data *arr = NULL;
int num_elements = 0;
add_one_element(arr, &num_elements);
printf("arr.s = %s\n", arr[num_elements-1].s);
for(int i = 0; i < 10; i++)
printf("arr[%d].arr[%d] = %d\n", num_elements-1, i, arr[num_elements-1].arr[i]);
free(arr);
return 0;
}
EDIT 1: попытался исправить проблему. На этот раз я получаю test(91537,0x7fff79532000) malloc: *** error for object 0x7fff5f5c0ad0: pointer being realloc'd was not allocated
. Что свидетельствует о том, что перераспределение не удалось.
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
struct data {
char s[10];
int arr[10];
};
void add_one_element(struct data **arr, int *num_elements)
{
/*increment counter*/
*num_elements +=1;
arr = realloc(arr, *num_elements * sizeof(struct data));
strcpy(arr[*num_elements-1]->s, "ABC");
for(int i = 0; i < 10; i++)
arr[*num_elements]->arr[i] = i;
}
int main()
{
struct data *arr = NULL;
int num_elements = 0;
add_one_element(&arr, &num_elements);
printf("arr.s => %s\n", arr[num_elements-1].s);
for(int i = 0; i < 10; i++)
printf("arr[%d].arr[%d] = %d\n", num_elements-1, i, arr[num_elements-1].arr[i]);
return 0;
}
Вы 'realloc'ating адрес локальной переменной вместо' 'arr' в main', передать указатель на указатель:' недействительным add_one_element (структура данных ** обр, Int * num_elements) 'и 'add_one_element (& arr, & num_elements);' –
Тщательно перешагнув код в отладчике, вы быстро укажете на эту проблему. –
Что-то вроде 'arr = realloc (arr, ...' очень плохая практика! Что делать, если 'realloc' возвращает нулевой указатель? Вы теряете массив. Первое, что нужно для правильной обработки ошибок! – Olaf