2012-04-16 104 views
0
#include <stdio.h> 
    #include<string.h> 
    #include<stdlib.h> 

    int main() 
    { 
    char *words[] = {"mHello", "kWorld", "kHow", "9Are", "3You?"}; 
    char **parsed = malloc(5); 
    int i; 
    for (i = 0; i < 5; i++) 
    { 
     int n = strlen(words[i]); 
     parsed[i] = malloc(n); 
     strncpy(parsed[i], words[i] + 1, n); 
     printf("[%s] ", parsed[i]); 
    } 
    printf("\n----------------------\n"); 
    for (i = 0; i < 5; i++) 
     printf("[%s] ", parsed[i]); 
     return 0; 
    } 

parsed[i]包含words[i]没有第一个字符。为什么为这个数组中的第一个元素打印垃圾?

输出是

[Hello] [World] [How] [Are] [You?] 
---------------------- 
[▒▒ o] [World] [How] [Are] [You?] 

为什么第一个printf调用parsed[0]正常工作,而第二个不?

此外,如果我从words中删除了一个元素,则此代码正常工作。到底是怎么回事 ?

+0

哎哟,你说得对。我刚看到它,因此删除了我的评论。 – glglgl 2012-04-16 17:05:37

回答

9

malloc不分配正确的空间指向虽然字符串,它应该是

parsed = malloc(sizeof(char*)*5) 
+0

我希望C有一个直接的失败方式。当代码像这样随机工作时,我很难进行调试。 – user1033777 2012-04-16 17:12:11

+0

@ user1033777如果您尝试''解析''parsed [i]'',那么在尝试释放'parsed [0]'时可能会获得一个很好的信息段错误',因为进一步的'malloc'可能会破坏簿记数据那。此外,valgrind也有帮助。 – 2012-04-16 17:15:30

+0

是的,'免费的'确实导致了一个。我会检查valgrind。 – user1033777 2012-04-16 17:23:43

1

对于初学者来说,**parsed不是被存储在那里的所有指针不够大。它应该被分配

parsed=malloc(sizeof(*parsed)*5); 

而且你可以滚了单串分配并复制到一个这样的:

parsed[i]=strdup(words[i]+1); 

这也处理字符串长度正确,如今乍一看它看起来像有可能一个问题已被解决。

+0

这难道不是很大的记忆吗? – 2012-04-16 17:01:01

+2

@HunterMcMillen为什么?它正好是正确的数量 - 是指针大小的5倍。 – glglgl 2012-04-16 17:02:24

+0

我总是使用成语x = malloc(sizeof(* x)* n),它无论指向什么类型的指针x都可以工作。 – jjrv 2012-04-16 17:12:20

0

要添加到其他答案,您可以使用valgrind跟踪这些内存错误。

如果您希望自己的代码在这些情况下发生故障,可以使用替代工具address sanitizer

相关问题