2012-04-21 14 views
1

次のCコードをコンパイルしようとすると、バスエラーが発生します。 私はそれがmemcpyと呼ばれる方法と関係があると推測していますが、私はそれを理解できません。 ご協力いただければ幸いです!あなたの割り当て後、NOTあなたの割り当てられたメモリへの文字列リテラルにバスエラー: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

答えて

8

ここpポイント!

次に、memcpyでそのメモリに書き込もうとします。

多くのCコンパイラは、文字列リテラルを読み取り専用メモリに割り当てます。したがって、バスエラーです。あなたの問題を解決するために

、あなたはコピー文字H、E、L、L、及びoはあなたがstrncpyを使用して、mainの1行目にpに割り当てられた空間にする必要があります。これにより、自分で割り当てたメモリを指し示すようになります。後でmemcpyは問題ありません(あなたのバッファをあふれさせない限り)。

一般に、文字列変数に直接割り当てるときは、変数ポイントを別のメモリアドレスにすることに注意してください。あなたのコードでは、いくつかの文字列にスペースを割り当てていますが、変数に文字列リテラルを割り当てると、それらが指し示す場所が変更され、メモリリークが発生します。

+0

pに書き込む方法はありますか? – Sid

+0

編集で回答しました。 –

+0

ありがとう!私は今これを理解しようとしています! – Sid

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"); 

ところで、 (char *)または (int *)のようなキャストを使用して、より良いていない mallocを使用して次のように 正しい方法です。