在一个函数中分配一个二维数组并在另一个函数中重新分配它?

Allocating a 2D array in one function and reallocating it in another function?

这是我的代码:

void allocating(char **word_array)
{
    int i = -1;

    while(i < 20)
    {
        i++;
        printf("%d \n", i);
        word_array[i] = malloc(strlen("hello good sir") + 1);
        strcpy(word_array[i], "hello good sir");
        if (i = 9)
        {
            word_array = realloc(word_array, 20 * sizeof(char *));
        }
    }
}

int main()
{
    char **word_array = malloc(sizeof(char *) * 10);
    
    allocating(word_array);

    free(word_array);
    int i;
    for (i = 0; i < 20; i++)
    {
        printf("%s \n", word_array[i]);
        free(word_array[i]);
    }
}

我正在尝试动态内存分配,但我似乎无法让代码正常工作。它在 i = 10 时运行无限循环。分配下一个内存位置有问题吗?为什么它一直打印 10 而不是递增?

谢谢!

此代码有多个问题。第一:

if (i = 9)

这是一个赋值,而不是比较,所以因为赋值是 non-zero,所以条件总是为真。你想要:

if (i == 9)

其次,您比预期多循环了一次:

    while(i < 20)
    {
        i++;

i 为 19 时,条件通过并进入循环,然后 i 立即递增到 20,这超出了已分配数组的边界。

相反,将 i 初始化为 0 并在循环的 结束 执行递增。

第三,当你在 allocating

中执行此操作时
word_array = realloc(word_array, 20 * sizeof(char *));

您正在修改局部变量。对它的更改不会反映在函数之外。因此,当 main 中的函数 returns word_array 将具有与之前相同的值时,如果 realloc 移动了内存,它将不再是有效指针。

需要更改函数以获取 char ** 的地址,即 char ***:

void allocating(char ***word_array)
{
    int i = 0;

    while(i < 20)
    {
        printf("%d \n", i);
        (*word_array)[i] = malloc(strlen("hello good sir") + 1);
        strcpy((*word_array)[i], "hello good sir");
        if (i == 9)
        {
            *word_array = realloc(*word_array, 20 * sizeof(char *));
        }
        i++;
    }
}

并且调用更改为传递地址:

allocating(&word_array);

最后,您 free(word_array) 在函数 returns 之后紧接着使用 word_array。释放后读取指针值是 undefined behavior.

在您使用完指针后,将调用移至free