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

时间:2017-03-12 00:08:51

标签: c arrays pointers

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

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

1 个答案:

答案 0 :(得分:2)

是的,你正在以错误的方式重新分配你的阵列 - 实际上有几种错误的方式。

您忘记了{em>值将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()重命名为其他内容,并从其他函数调用它),则会出现内存泄漏。