C、double数组和char数组中realloc的区别

约斯库蒂克

我必须动态增加双数组的长度。我知道,如何用字符数组来做,所以我试过这个:

int main() {
    char * tmp = NULL;
    for (int i = 1; i <= 4; i++) {
        tmp = realloc(tmp, i * sizeof(char));
        tmp[i] = 'i';
    }
    puts("char OK");
    double * tmp1 = NULL;
    for (int i = 1; i <= 4; i++) {
        tmp1 = realloc(tmp1, i * sizeof(double));
        tmp1[i] = 0;
    }
    return 0;
}

第一个数组工作正常。而第二个则用消息粉碎realloc(): invalid next size

这是我的两个问题:

  1. 为什么这种方式在双数组中不起作用?
  2. 如何动态增加双打数组的大小?

UPD:删除了一个错字

苏拉夫·戈什

TL;DR:两个片段都是错误的,第一个片段似乎由于未定义的行为而起作用

详细说明,问题在于您的索引逻辑。C 使用基于 0 的索引。因此,在从ias 的值开始迭代的循环中1,通过使用

 tmp[i] = .......

你试图访问无效的内存,此时,只有访问tmp[i-1]是有效的。

您需要使用tmp1[i-1] = 0;,同样如此。


那说,

  1. 在使用返回的指针之前,始终检查内存分配器函数是否成功。
  2. 永远不要使用表格

      pointer = realloc (pointer, ......)
    

    因为,如果realloc调用失败,您最终也会丢失原始指针。

    引用C11,章节 §7.22.3.5

    realloc函数返回一个指向新对象的指针(它可能与指向旧对象的指针具有相同的值),如果无法分配新对象,则返回一个空指针。

    [....] 如果无法为新对象分配内存,则不会释放旧对象并且其值不变。

    • 始终使用临时指针变量来存储 的返回值realloc()
    • 检查调用是否成功 [非空返回值] 和
    • 如果需要,然后将其分配回原始变量。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章