2015-10-15 105 views
1

当我尝试将“init”复制到我的字符串数组中时,我总是收到分段错误,但我找不到原因。如果我将strcpy()行注释掉,我不会收到分段错误,并且init可以正常打印。strcpy上的分割错误11()

FILE *fp = fopen(argv[1],"r"); 
    char *init = readToken(fp); 
    printf("%s",init);  
    char **words = malloc(sizeof(char*) * 2); 
    strcat(*words,init); 

PS:readTokenfscanf

+0

能否请您发表readToken(..)呢? –

+0

[分割故障常见原因的确定清单]的可能重复(http://stackoverflow.com/questions/33047452/definitive-list-of-common-reasons-for-segmentation-faults) – CodeMouse92

回答

0

你分配的char *秒的数组:

char **words = malloc(sizeof(char*) * 2); 

这些char *的立场给什么尤其如此。他们可能是空的,他们可能会指向堆栈,谁知道。它们未初始化且未定义。

strcat(*words,init); 

好像是说

strcat(words[0], init); 

如果words[0]已经指出某种有效的字符串,这是可行的。就像这样,你将一个字符串附加到内存中的某个未知点上。

strcpy(*words, init); 

只是写道:串入内存中未知点,这样就不会帮助。

您需要为您的新字符串分配空间。最简单的方法是通过strdup(),它将传入的字符串的副本。所以:

*words = strdup(init); 

会做得很好,正如

words[0] = strdup(init); 
0
char **words = malloc(sizeof(char*) * 2); 

你为什么使用双指针?

无论如何,如果你想通过*wordsstrcat为目标,则可以分配它,因为上面的一行刚刚分配内存char **words,但是当你解引用它,你有一个指针,它指向的未定义区域内存

+0

分配给你什么意思它?分配内存和分配有什么不同?或者你是不是在谈论“*词”? –

+0

另外,我使用了一个双指针,因为它是一个字符串数组。 –