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,则此代码可以正常工作。到底是怎么回事 ?

4

3 回答 3

9

malloc没有为指向字符串的指针分配正确的空间,它应该是

parsed = malloc(sizeof(char*)*5)
于 2012-04-16T16:58:40.307 回答
1

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

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

您可以滚动单个字符串分配并将所有字符串复制到一个中,如下所示:

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

这也正确处理了字符串长度,现在乍一看似乎可能存在一个问题。

于 2012-04-16T16:59:32.387 回答
0

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

如果您希望您的代码在这些情况下严重失败,另一种工具是address sanitizer

于 2012-04-16T17:22:18.450 回答