0
char str1[]= "To be or not to be";
char str3[]= "To eat or to eat";
char * str2=(char*)malloc(80);
//char str3[40];
str2[0]=NULL;
/* copy to sized buffer (overflow safe): */
strcat(str2, str1);
strcat(str2, str1);
free(str2);str2[0]=NULL;//<<==Marked line
strcat(str2, str3);
strcat(str2, str3);

次のコードでは、「食べるか食べないか」を2回出力する操作は正常に機能しますが、「str2 [0] = NULL;」を削除した場合 マークされた行から機能せず、「to be or not to be」を 2 回、「to eat or not to eat times」と出力するのはなぜですか?

4

3 に答える 3

1

それは奇妙な振る舞いではありません。Free は、メモリから参照を完全に削除します。基本的に、ヘッダー string.h からfree(str2);使用するほうがよい変数を削除しています。bzero(str2,80);

于 2013-06-19T14:27:20.343 に答える
1

それは未定義の動作です

free(str2);

ポインターが指すメモリーをヒープに解放し、ポインターを無効にします。そのポインターを使用してそのメモリにアクセスすると、結果が得られる可能性があるためです。

そうは言っても、実装ではメモリに引き続きアクセスできるように見えるため、後続のstrcat()呼び出しでは新しい文字列を元の 2 つの文字列に追加するだけです。したがってTo be or not to be、バッファにTo eat or to eat2回あり、2回追加したため、質問で説明した結果が表示されます。この動作に依存するべきではありません - 他の条件では、メモリの破損、プログラムの終了、その他を含むがこれらに限定されない他の結果が発生する可能性があります。

于 2013-06-19T14:26:36.603 に答える
0

これよりも優れているのは、次のように strcpy と strcat を単純に使用することです。

char str1[]= "To be or not to be";
char str3[]= "To eat or to eat";
char * str2=(char*)malloc(80);
//char str3[40];
/* copy to sized buffer (overflow safe): */
strcpy(str2, str1);
strcat(str2, str1);

strcpy(str2, str3);
strcat(str2, str3);

それが最も安全で簡単な方法です:)

于 2013-06-19T14:41:33.323 に答える