我有以下代码,在尝试访问数组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/