C.双数组和char数组中的realloc之间的区别

Yos*_*tik 0 c memory arrays memory-management realloc

我必须增加双数组的长度。我知道,如何用char数组来做,所以我尝试了这个:

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;
}

Run Code Online (Sandbox Code Playgroud)

第一个数组工作正常。但是第二个消息粉碎了realloc(): invalid next size

因此,有两个问题:
1.为什么这种方法不能在双数组中工作?
2.如何动态增加双精度数组的大小?

UPD:删除了错字

Sou*_*osh 9

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

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

 tmp[i] = .......
Run Code Online (Sandbox Code Playgroud)

您正在尝试访问无效的内存,这时,仅可访问最多tmp[i-1]有效。

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


那就是

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

      pointer = realloc (pointer, ......)
    
    Run Code Online (Sandbox Code Playgroud)

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

    引用C11第§7.22.3.5章

    realloc函数返回指向新对象的指针(该值可能与指向旧对象的指针的值相同),或者如果无法分配新对象,则返回空指针。

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

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