2013-03-08 80 views
1

我的C語言技能有點生疏,而前幾天我正在做一個任務並碰到一些指針。我不知道爲什麼,但是這完全讓我難住了。所以,請原諒我,如果解決方案是微不足道的。將數據從一個指針複製到另一個seg故障

我寫下了下面的代碼,將一個指針中的數據複製到另一個指針。我不想使用memcpy,strcpy或任何其他功能。

char *word = "hello world!"; 
char *ptra = NULL; 

ptra = malloc(strlen(word) + 1); 

for (; word != '\0'; word++, ptra++) { 
    *ptra = *word; 
} 

*ptra = '\0'; 

現在,當我編譯這個,我得到一個分段錯誤。任何人都可以請幫我解決這個問題嗎?

+0

該錯誤很容易解決,但可能有點棘手,特別是如果你是新手指針。別擔心,它會變得更容易。另外,你的內存分配中的'+ 1'也很好。這是人們(特別是新程序員)忘記的東西,並且導致各種難以追蹤的錯誤。 – 2013-03-08 23:22:29

+2

在程序中,您直接增加了指針而不進行復制。因此,即使在執行復制之後,您可能無法使用該字符串,也無法在程序結束時釋放內存。製作指針的副本將有所幫助。 – Ganesh 2013-03-08 23:23:04

+0

優秀點@Ganesh。 – 2013-03-08 23:25:32

回答

7

你缺少一個dereferende:它應該是*word != '\0'在循環條件:

for (; *word != '\0'; word++, ptra++) { 
    //^Here 
    *ptra = *word; 
} 

由於word是一個指針,它永遠不會等於\0,使你的循環會過去兩結束字符串。

+2

另外,如果OP在使用之前習慣檢查'malloc'的結果,那將會很好。 – 2013-03-08 23:20:53

+0

非常感謝das和Nik。尼克,我同意你的看法。我應該使用assert還是僅僅使用if語句?所以通過這個我的意思是,我malloc後,我可以使用'assert(ptra!= NULL)'或'if(ptra == NULL)然後打印錯誤消息'? – Triple777er 2013-03-08 23:24:34

+1

你應該爲這種類型的事情使用'if'語句。請記住,一個'assert'通常只能在你的程序的「調試」版本中工作,當它失敗時會導致程序立即退出。想一想'斷言'這句話:「這件事情不應該發生,如果它發生,恐慌,把你的手舉起來,像一個小女孩一樣哭泣,等着我!」內存分配失敗並不真的(或者,我應該說*通常是*)符合這個標準。 – 2013-03-08 23:31:12

相關問題