我有以下代码在尝试访问数组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;
}
答案 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()
重命名为其他内容,并从其他函数调用它),则会出现内存泄漏。