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]正しく機能するのに、2 番目の呼び出しは機能しないのはなぜですか?

また、 から 1 つの要素を削除するとwords、このコードは正しく機能します。何が起こっている ?

4

3 に答える 3

9

ただし、文字列へのポインタに正しいスペースを割り当てていませmallocん。

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

手始めに、**parsedそこに格納されているすべてのポインタに対して十分な大きさではありません。割り当てる必要があります

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

そして、個々の文字列の割り当てをロールして、次のようにすべてを1つにコピーできます。

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

これは文字列の長さも正しく処理しますが、一見すると1つの問題でずれている可能性があるように見えます。

于 2012-04-16T16:59:32.387 に答える
0

他の回答に追加するには、 valgrindを使用して、これらのようなメモリ エラーを追跡できます。

このような場合にコードを激しく失敗させたい場合の代替ツールは、アドレス サニタイザーです。

于 2012-04-16T17:22:18.450 に答える