3

次の C コードをコンパイルしようとすると、バス エラーが発生します。私が memcpy を呼び出した方法と関係があると思いますが、それを理解することはできません。どんな助けでも大歓迎です!

#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;
}
4

2 に答える 2

10

ここでpは、割り当てられたメモリではなく、割り当て後の文字列リテラルを指しています!

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

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

問題を解決するには、文字 h、e、l、l、および o を、 を使用して の最初の行に割り当てたスペースにコピーする必要があります。これは、自分で割り当てたメモリを指し続けます。後者は問題ありません(もちろん、バッファをオーバーフローしない限り)。pmainstrncpypmemcpy

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

于 2012-04-21T04:50:16.500 に答える
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");

ところで、ormallocのようなキャストを使用しないほうがよいでしょう。(char *)(int *)

于 2012-04-21T08:16:53.280 に答える