当我尝试复制" init"时,我一直遇到分段错误进入我的字符串数组,我无法弄清楚为什么。如果我注释掉strcpy()
行,我就不会出现分段错误,并且init
打印正常。
FILE *fp = fopen(argv[1],"r");
char *init = readToken(fp);
printf("%s",init);
char **words = malloc(sizeof(char*) * 2);
strcat(*words,init);
PS:readToken
是fscanf
。
答案 0 :(得分:0)
char **words = malloc(sizeof(char*) * 2);
为什么使用双指针?
无论如何,如果你想将*words
传递给strcat
作为目的地,你必须分配它,因为上面的行只为char **words
分配了内存,但当你取消引用它时有一个指向内存未定义区域的指针
答案 1 :(得分:0)
您分配了char *
s:
char **words = malloc(sizeof(char*) * 2);
这些char *
特别指向 nothing 。它们可能是NULL,它们可能指向堆栈,谁知道。他们没有初始化和未定义。
strcat(*words,init);
就像说
strcat(words[0], init);
如果words[0]
已经指向某种有效的字符串,这将起作用。实际上,你将一个字符串附加到内存中的某个未知点。
strcpy(*words, init);
只需将字符串写入内存中的未知点,这样做无济于事。
您需要为新字符串分配空间。最简单的方法是通过strdup()
,它复制传入的字符串。所以:
*words = strdup(init);
会很好,
words[0] = strdup(init);