我有一个数组如下:
char* arg[1024];
现在初始化arg,我将传递给一个函数,我正在执行以下操作:
arg = (char**)calloc(1024,sizeof(char*));
但是每当我将arg传递给函数时。我最终得到了一个分段错误。该函数基本上是对字解析执行一些非常简单的命令:
void parse(char* buffer, char** arg)
{
while(*buffer!='\0')
{
*arg=buffer;
arg++;
while(*buffer!=' ')
buffer++;
while(*buffer == ' ')
{
*buffer = '\0';
buffer++;
}
}
}
我在内存分配方面做错了吗?或传递指针?
答案 0 :(得分:4)
char* arg[1024];
提供了一个静态分配的1024个char
指针数组。您不需要再次动态分配它。请删除calloc()
行。
除了你的分配问题,还有另一个错误。看看:
while(*buffer != ' ')
buffer++;
如果buffer = "test"
会怎样?您的while
- 循环将找不到空格并继续在buffer
之外迭代。导致各种未定义的行为...
要解决此问题,您还需要检查字符串终止符:
while(*buffer != 0 && *buffer != ' ')
buffer++;
答案 1 :(得分:1)
char* arg[1024];
是 char指针的数组。
arg = (char**)calloc(1024,sizeof(char*));
错了。我们无法将新分配的内存地址分配给arg
。
如果你想创建字符串数组,那么这样做:(我认为你需要这个)
char* arg[1024];
arg[i] = (char*)calloc(1024,sizeof(char));
其中i
是索引。
你说segmentation fault.
但我认为你应该得到arg = (char**)calloc(1024,sizeof(char*));
语句的编译错误。 错误:分配
我还注意到parse()
中的错误。 (由 Veger 回答)
您还可以使用strsep()
函数解析buffer
字符串,此处my answer可用于此目的。
答案 2 :(得分:1)
arg已在您的案例中分配。你说你需要它是1024个元素大 - 它静态分配
=>退出char *arg[1024]
并将其替换为char **arg