c - 重新分配指向 char 的指针数组

标签 c arrays pointers

我有以下代码,在尝试访问数组splitted时出现段错误。我是否以错误的方式重新分配指针数组?

void allocate (char** splitted) {
    splitted = malloc(sizeof(char*));
    for (int i = 0; i < 3; i++) {
        splitted = realloc(splitted, (i + 1) * sizeof(char*));
        splitted[i] = "asd";
    }
}

int main () {
    char** splitted = NULL;
    allocate(splitted);
    for (int i = 0; i < 3; i++) {
        printf("%s", splitted[i]);
    }
    return 1;
}

最佳答案

是的,您正在以错误的方式重新分配数组 - 实际上有几种错误的方式。

你忘记了splitted通过传递给函数。因此,函数内对其值的任何更改对于调用者来说都是不可见的。

因此,要么更改函数以添加额外的间接级别。

void allocate (char*** splitted)
{
    *splitted = malloc(sizeof(char*));
    for (int i = 0; i < 3; i++)
    {
        *splitted = realloc(splitted, (i + 1) * sizeof(char*));
        (*splitted)[i] = "asd";
    }
}

/*  to call it in main() */

allocate(&splitted);

或更改它以返回新值

char *allocate (char** splitted)
{
    splitted = malloc(sizeof(char*));
    for (int i = 0; i < 3; i++)
    {
         splitted = realloc(splitted, (i + 1) * sizeof(char*));
         splitted[i] = "asd";
    }
    return splitted;
}

/*  to call it in main() */

splitted = allocate(splitted);

下面是一些其他注释。

我假设你有一个#include <stdlib.h>在您的代码之前(否则使用 malloc()realloc() 将无法编译)。将来,提供 MCVE,这样试图帮助您的人就不必对您遗漏的事情做出假设或猜测。

malloc()的来电函数中不需要,因为 realloc()可以接受NULL .

此外,realloc()不需要在循环中。单realloc()在循环执行之前 - 只需提供最终的预期大小。

强烈建议检查 realloc() 等函数的返回值和malloc() ,因为它们都可以返回错误指示。显然,如果检查返回值,还需要明智地处理错误。

由于您的代码使用 malloc()/realloc()要分配内存,还需要释放它。例如free(splitted)main() 末尾。是的,现代操作系统会进行清理 - 但并非所有系统都会这样做 - 所以不使用 free()是一个坏习惯。另外,如果您重复使用代码(例如将 main() 重命名为其他名称,并从其他函数调用它),您将会遇到内存泄漏。

关于c - 重新分配指向 char 的指针数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42742189/

相关文章:

将 "normal"矩形转换为一组 GLes vector ?

c++ - 两个数组之间的数据聚类和比较

arrays - 如何使递归函数找到数组中最大数字的索引?

c++ - 如何使用下标运算符中分配的值来做一些事情?

c++ - "if(pointer) delete ponter"即使指针未初始化也尝试删除

c - strcpy 函数如何同时接受地址和字符串常量?

c++ - Delphi 中的动态数组和内存管理

c - 在c中生成字指针数组

c - 单步执行指向字符串的指针数组 - "lvalue required as increment operand"

c - 看门狗:设备或资源忙