-3

私のキャラクターポインターは、「Hello world」と言うメモリを指しています。これを他のポインターと比較し、後でstrcpyを実行したいと考えています。私はchar *でできることを座っています

char *A ="hello"
char *B ="";

strcmp(A,B); // this compares correctly because B points to diff string
strcpy(B,A); // will this statment copies the string alone or both will point to same memory
4

2 に答える 2

5
char *B ="";

これは、Bがポインタであり、定数 string を指していることを意味します""

A文字列をBwithにコピーしますstrcpy(B,A);

これは、が指している (および定数文字列を指している)Aメモリに文字列をコピーしているため、未定義の動作が発生することを意味します。BB

このような問題を回避するには、B ポインタがメモリ空間を指すようにする必要があります。たとえば、malloc で割り当てられた動的メモリ空間を B に指すことができます。

char *B = malloc(10*sizeof(char));

次のようにして、メモリのサイズを文字列サイズとまったく同じにすることができます。

char *B = malloc((strlen(A)+1)*sizeof(char));

+1 は、文字列の null ターミネータ文字用です

問題を回避する別の解決策: B をポインタとしてではなく、文字の配列として定義します。

char B[10];
于 2013-03-11T09:26:37.530 に答える
0

strcpy は引数として宛先とソースの char * を必要とするため、コードは正常にコンパイルされます。

char * strcpy ( char * destination, const char * source );

しかし、実行するとセグメンテーション違反が発生します... bcoz B は no を指します。まず B=malloc(6) によって、B が指すメモリ ブロックを割り当てる必要があります。

char *A ="hello";
char *B;

B = malloc(6);

strcmp(A,B);
strcpy(B,A);

これを行うと、はい、strcpy はまったく新しい文字列をコピーします。A と B はどちらも 2 つの異なる場所を指します。

于 2013-03-11T09:27:33.790 に答える