使用realloc缩小数组,丢失第一个元素

时间:2018-07-12 00:49:09

标签: c dynamic-memory-allocation realloc

我一直在尝试使用calloc和realloc编写示例程序,但遇到一个问题,当我使整数数组变小时,似乎要删除第一个元素而不是最后一个元素。 / p>

int *m = (int*)calloc(2, sizeof(int));

    *m = 1;     
    *(m+1) = 2;   
    printf("\tInt 1: %d\n", m[0]);
    printf("\tInt 2: %d\n\n", *(m+1));

// REALLOC

printf("How many elements the array have? ");
scanf("%d", &num);

*m = (int *)realloc(m, num * sizeof(int));

    printf("ARRAY NOW HAS %d PLACES\n\n\t", num);

    for(i = 0; i < num; i++) {

        m[i] = i + 1;
        printf("%d ", m[i]);

    }

// DELETING MEMBERS OF AN ARRAY

while((d < 0) || (d > num)) {

    printf("\n\nChoose which position of the previous array should be deleted (0 = first): ");
    scanf("%d", &d);
}

printf("\nUPDATED ARRAY:\n\n");

for(i = d; i < num - 1; i++) {

    m[i] = m[i + 1];
}

*m = (int *)realloc(m, (num - 1)*sizeof(int));

num--;

for(i = 0; i < num; i++) {

    printf("%d ", m[i]);
}

该程序输出的示例为:

        Int 1: 1
        Int 2: 2

How many elements the array have? 17
ARRAY NOW HAS 17 PLACES

        1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

Choose which position of the previous array should be deleted (0 = first): 6

UPDATED ARRAY:

10620272 2 3 4 5 6 8 9 10 11 12 13 14 15 16 17

如果我包含应该删除的数组的最后一个成员(在本例中为m [16]),则会显示:

10620272 2 3 4 5 6 8 9 10 11 12 13 14 15 16 17 17

当然,我不能完全确定发生了什么,但似乎只是删除了m [0]的值?

在此先感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

修改初始值的原因是您要分配它:

*m = (int *)realloc(m, num * sizeof(int));

应该是

m = realloc(m, num * sizeof(int));

您的代码还应该产生警告,告诉您指向包含int的数组元素的指针的分配是无效的。解决此警告应该可以解决您的问题。

请注意表格的赋值

m = realloc(m, ...);

m的两面都使用realloc本质上是不安全的,因为realloc可能返回NULL-例如,当没有足够的内存可分配时。盲目分配给m会使m的旧值无法访问,从而导致无法正确释放。在生产中,您应该将realloc的结果分配给一个临时文件,然后检查其是否为NULL,然后才将结果分配回m

答案 1 :(得分:0)

除了@dasblinkenlight很好的答案之外,当减小分配大小并且重新分配失败时(罕见的事件),代码可以简单地继续使用原始指针。

建议重写,假设num > 0

// *m = (int *)realloc(m, num * sizeof(int));
void *t = realloc(m, sizeof *m * num);
if (t) {
  m = t;
}