#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#define LENGHT 20
typedef struct {
unsigned id;
char name[LENGHT];
char genre[LENGHT];
char nazionality [LENGHT];
int year_carrier_started;
bool check;
}Artist;
void print(Artist *arr, int *i);
void addOne(Artist *arr, int *i);
int main(void) {
int index = 5;
Artist *array = malloc(sizeof(int)*index);
for (int i=0;i<index;i++)
{
printf("Insert a number:\n");
scanf("%d",&array[i].id);
}
do
{
addOne(array,&index);
print(array,&index);
}while(1);
system("pause");
free(array);
return EXIT_SUCCESS;
}
void addOne(Artist *arr, int *i)
{
realloc(arr,sizeof(Artist)*(*i)+1);
printf("Insert another one:\n");
scanf("%d",&arr[*i].id);
*i = *i +1;
print(arr,i);
}
void print(Artist *arr, int *i)
{
for (int j=0;j<*i;j++)
{
printf("Number: %d position %d\n",arr[j].id,j);
}
}
大家好,我从我的程序中得到了这个结构,我需要的是每次用户想要添加新艺术家时重新分配。添加了大约 10/15 个用户后,它无缘无故地崩溃了(至少对我来说没有)。我究竟做错了什么? (Dat *i 通过引用传递,它计算已经有多少艺术家)。
最佳答案
How to properly use realloc in c(?)
After adding like 10/15 more users, it crashes for
noreason
@Christian Gibbons强烈建议:使用realloc()的返回值。 array
之前的值可能无效。
乘以正确的值
// sizeof(Artist)*(*i)+1
sizeof(Artist)*((*i)+1)
使用realloc()的返回值
// realloc(array,sizeof(Artist)*(*i)+1);
void *new_ptr = realloc(array,....
检查 realloc() 结果
// realloc(array,sizeof(Artist)*(*i)+1);
void *new_ptr = realloc(array,....
if (new_ptr == NULL) OutOfMemory();
else array = new_ptr;
考虑按对象而不是类型调整大小
// realloc(array,sizeof(Artist)*(*i)+1);
void *new_ptr = realloc(array, sizeof *array *((*i)+1));
<小时/>
大家一起
Artist *array = malloc(sizeof *array);
if (array == NULL) Handle_OutOfMemory();
...
void *new_ptr = realloc(array, sizeof *array * ((*i)+ 1));
if (new_ptr == NULL) {
// `array` still has *i elements assigned to it.
Handle_OutOfMemory();
} else {
array = new_ptr;
(*i)++;
}
关于c - 如何在c中正确使用realloc?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50865445/