2015-12-09 51 views
1

我傳遞字符串轉換結構,我的樂隊像這樣在for循環錯誤複製到結構

printf("copy = %s\n",copy_p); 
str[i].string=(char*)malloc(strlen(copy_p)+1 * sizeof(char)); 
strcpy(str[i].string,copy_p); 
printf("skop = %s\n" , str[i].string); 

所以,如果copy_p變量是「計劃已停止工作」,這是發生了什麼

printf("copy = %s\n",copy_p); // copy = Program has stopped working 
printf("skop = %s\n" , str[i].string); // skop = Program has stopped working 

但是,如果我打電話給這個printf("%s\n",str[0].string)它輸出Program has stopped work!爲什麼呢?但它不是喜歡這一切它工作的大部分輸入的時間

+2

什麼類型是'copy_p',它的大小是多少? –

+1

如果'copy_p'是一個指針,用'strlen'檢索字符串長度。 – Downvoter

+0

我建議你使用一個臨時的:'int tempSize =(sizeof(copy_p)+1;',然後中斷並檢查tempSize。 –

回答

6

這行不正確,無論copy_p類型:

str[i].string=(char*)malloc(sizeof(copy_p)+1 * sizeof(char)); 
  • 如果copy_p與初始化字符數組一個字符串,即

    char copy_p[] = "Program has stopped working"; 
    

    然後+1是不必要的,因爲陣列尺寸已經包括空終止符。

  • 如果copy_p是一個指針char *copy_p,那麼你需要調用strlen而不是sizeof,即

    str[i].string=malloc(strlen(copy_p)+1 * sizeof(char)); 
    

注:malloc鑄造結果是不必要的C.

+0

是的 - 我試圖放棄提示:) –

+0

用strlen試過,它做了同樣的事情,這不會發生在所有字符串tho上,大多數在打印後都很好...... – user3706129

+0

@ user3706129 It看起來像你的其他東西代碼在結尾之前將四個字符的空終結符插入到字符串中。最初的代碼(帶有'sizeof'而不是'strlen')可能發生,因爲相鄰的塊被分配給其他的字符串或結構。有了'strlen',這可能會發生在其他地方的內存錯誤。嘗試通過valgrind或其他內存配置文件運行該程序,以查看正在發生的事情。 – dasblinkenlight