2012-04-21 64 views
1

當我嘗試編譯以下C代碼時,出現總線錯誤。 我猜測它與我調用memcpy的方式有關,但是我無法弄清楚。 任何幫助將不勝感激!總線錯誤:10. C代碼,malloc示例

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 

int main() 
{ 

    char *p = (char*)malloc(sizeof(char)*11); 
    // Assign some value to p 
    p = "hello"; 


    char *name = (char*)malloc(sizeof(char)*11); 
    // Assign some value to name 
    name = "Bye"; 

    memcpy (p,name,sizeof(char)*10); // Problem begins here 
    return 0; 
} 
+0

其他註釋:[不要強制malloc的返回值](http://stackoverflow.com/questions/605845/)。當爲此目的而存在'strncpy'和類似的函數時,爲什麼你使用'memcpy'來複制*字符串? – DCoder 2012-04-21 04:56:24

回答

8

這裏p指向字符串常量的分配之後,而不是你分配的內存!

然後您嘗試使用memcpy寫入該內存。

許多C編譯器在只讀存儲器中分配字符串文字,因此會出現總線錯誤。

解決您的問題,您應該複製字符H,E,L,L,與鄰爲你在main第一線p分配,使用strncpy的空間。這使p指向你自己分配的內存;後面的memcpy會沒事的(只要你當然不會溢出你的緩衝區)。

請注意,一般情況下,當您直接分配給字符串變量時,您將變量指向不同的內存地址。在你的代碼中,你已經爲一些字符串分配了空間,但是當你將字符串文字分配給變量時,你正在改變它們指向的位置,導致內存泄漏。

+0

有沒有辦法在p上寫? – Sid 2012-04-21 04:52:15

+0

在編輯中回答。 – 2012-04-21 04:53:38

+0

非常感謝!我一直試圖弄清楚這一點現在! – Sid 2012-04-21 04:59:25

0

在您的代碼中,p = "hello""hello"返回指向字符串hello的指針,並且hello無法更改。你使用p = "hello"也意味着讓p也指向這個字符串。所以當你試圖改變它時,你會得到一個錯誤。 正確的做法是像如下: char a[] = "hello";

char *a = malloc(sizeof(char)*11); /*cast is not good*/ 
strcpy (a, "hello"); 

BTW,使用malloc最好不要使用投像(char *)(int *)