c - 如何在c中正确使用realloc?

标签 c

#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 no reason

@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/

相关文章:

clock_gettime纳秒计算

c++ - C & C++ 中 sizeof() 运算符的返回值

c - isdigit() 段错误

c - 变量参数不打印

c++ - 如何沙盒使用共享库的 C/C++ 项目

c - 未初始化的值 valgrind

c - printf() 影响缓冲区溢出情况

c - 无符号整数打印

c++ - 为什么 C++ 不支持变长数组?

c - 有什么方法可以比较正常的 Linux 延迟与 RTAI Linux 延迟测试吗?