在 C 中重新分配一个二维数组

Reallocating a two-dimensional array in C

所以我看到了一些与此相关的问题,但是 none 描述性太强了,或者对我来说解释得很好 所以我正在尝试更改字符串数组中的字符串数量,例如 array[3][155] 重新分配()到数组[4][155] 创建 4 个字符串,每个字符串包含 155 个字符,然后可以通过 fgets(array[4], 155, stdin) 进行修改; 然后打印出新数组

我的尝试

 #include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
int main () {
    int arrays = 3;
    int pnm = 0;
    char array[arrays][155]; //Default size is 3 you can change the size
    strcpy(array[0], "Hello from spot 0\n");
    strcpy(array[1], "Sup from spot 1\b");
    strcpy(array[2], "Sup from spot 2");
    while(pnm != arrays) {
        printf("Word %d: %s", pnm, array[pnm]);
        pnm++;
    }
    realloc(array, 4);
    strcpy(array[3], "Sup from spot 3!");
    printf("The array is now.\n");
    pnm = 0;
    while(pnm != 4) {
        printf("%s", array[pnm]);
        pnm++;
    }

}

在控制台输出

bash-3.2$ ./flash
Word 0: Hello from spot 0
flash(1968,0x7fff70639000) malloc: *** error for object 0x7fff5828f780: pointer being realloc'd was not allocated
*** set a breakpoint in malloc_error_break to debug
Word 1: Sup from spot Word 2: Sup from spot 2Abort trap: 6
bash-3.2$

您收到的错误消息非常好:

pointer being realloc'd was not allocated

如果您要使用 realloc,您需要向它传递一个 NULL 指针或使用 mallocrealloc 等函数动态分配的指针。你传递的指针指向的是一个存放在栈上的数组,它与堆不同,没有重新分配的特性。

我还看到您在调用 realloc 时参数为 4。realloc 函数无法知道您的数组结构或其元素有多大,因此您需要传递您想要的字节数。

此外,您需要将realloc 返回的指针存储在某个地方,最好是在检查它不是NULL 之后。如果重新分配 returns 一个非 NULL 指针,您应该忘记传递给它的原始指针。