簡體   English   中英

為什么要為該數組中的第一個元素打印垃圾?

[英]Why is garbage being printed for the first element in this array?

  #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刪除一個元素,則此代碼可以正常工作。 到底是怎么回事 ?

您的malloc並未為指向字符串的指針分配正確的空間,但是應該

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

對於初學者來說,“ **parsed不足以存儲在那里的所有指針。 應該分配

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

您可以滾動單個字符串分配,然后將其全部復制為一個:

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

這也可以正確處理字符串的長度,現在乍一看似乎有一個問題。

要添加其他答案,您可以使用valgrind跟蹤此類內存錯誤

如果您希望代碼在這種情況下很難失敗,可以使用另一種工具,即地址清理器

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM