我有一个String(char **
)数组,初始化为NULL
。在我尝试访问其元素时传递其地址后,它会给出分段错误。
//following code
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void parse(char ***test, char *str)
{
int i;
*test = (char**)malloc(sizeof(char*) * 3);
for(i=0; i<3; i++)
{
*test[i] = (char*) malloc(sizeof(char)*(strlen(str)+1));
strcpy(*test[i], str);
}
}
int main(void)
{
int i;
char *str = "Hello world";
char **test = NULL;
parse(&test, str);
for(i=0; i<3; i++)
printf("%s\n", test[i]);
return 0;
}
在函数解析中使用调试器所有元素都有正确的值并正确初始化和分配但是从main函数只有0索引行给出了正确的值,其余是段错误。
答案 0 :(得分:4)
*test[0]
应为(*test)[i]
。
http://en.cppreference.com/w/c/language/operator_precedence表示[]
的优先级高于*
,这不是您想要的。
您也不应该覆盖索引0。
sizeof(char)
始终为1,因此您可以将其遗弃。您也不应该转换malloc
的返回值并测试是否成功。
答案 1 :(得分:0)
这里的问题是
*test[0] = (char*) malloc(sizeof(char)*(strlen(str)+1));
您总是将内存分配给索引0
。
另外,在operator precedence table之后,您需要首先取消引用test
,然后对其应用idexing,因此,您基本上需要重新编写代码,如
(*test)[0] = malloc( strlen(str) + 1);
请注意:
See why not to cast malloc()
中C
及其家人的返回值。
sizeof(char)
保证生成1
。乘以它是多余的。