0

コードで_CrtIsValidHeapPointerエラーが発生しました。そして、私はついに問題の原因を突き止めました。
以下の例を使用して説明します。

char* c=(char*)malloc(20*sizeof(char));
//cout<<&c<<endl;
c="hello world";
//cout<<&c<<endl;  //if you uncomment the 2 clauses,you'll see the address is the same
                                  //which means the string literal is in the heap
cout<<c<<endl;
free(c);

1)文字列リテラルで使用されているスペースを解放できないように見えましたか?なんで?

2)valeeをcharの配列に割り当てるために使用するメソッドは何ですか?
ps:私はsprintf(c,"hello world");それがうまくいくのを使います。しかし、もっと良い方法はありますか?


答えを読んだ後。&cの意味を誤解していることに気づきました。代わりに
使用する必要があります。printf("%p\n",c);

4

4 に答える 4

7

を使用して文字列をコピーする必要がありますstrcpy

割り当てc="hello world"は文字列の内容をコピーしませんが、文字列リテラルのアドレスをポインタcに割り当てます。後で呼び出すfree(c)と、ポインタは有効なヒープアドレスではなくなります。

// 2つの句のコメントを外すと、アドレスが同じであることがわかります

表示されるのはポインタのではなく、ポインタcアドレスです。これは明らかに同じです。

于 2012-08-01T09:26:30.883 に答える
6

strcpy、またはより安全なバージョンを使用する必要がありますstrncpystrncpyを使用すると、十分なスペースがない場合に備えて、文字列を自分でNULで終了する必要があることに注意してください。

例:

char *some_other_string = ...;
int len = strlen(some_other_string);
char *c = malloc((len + 1) * sizeof(*c));
if (c == NULL)
    // handle error

strcpy(c, some_other_string);

free(c);

この場合、に十分なスペースがあることがわかっているcので、を使用できることに注意してくださいstrcpy。わからない場合は、処理できる場所まで文字列を切り取ることができます。

char *some_other_string = ...;
char *c = malloc((MAX_LEN + 1) * sizeof(*c));
if (c == NULL)
    // handle error

strncpy(c, some_other_string, MAX_LEN);
c[MAX_LEN] = '\0';

free(c);

strncpyの場合、十分なスペースがない場合、文字列はNULで終了しないため、手動で行う必要があることに注意してください。


サイドノート:

&c変数のアドレスですcc内容とは関係ありませんので、何をして&cも変わりません。

于 2012-08-01T09:27:24.807 に答える
3
c = "hello world";

文字列リテラルへのcポインタへのポインタを変更しています。"hello world"これは文字列をコピーするのではなく、cポインタを変更するだけです。関数を使用してstrcpy、の配列内の文字列をコピーする必要がありcharます。

strcpy(c, "hello world");
于 2012-08-01T09:27:29.313 に答える
0

言語のC++部分を使用する場合、これはすべてstd::stringC++標準ライブラリので処理されます。

std::string c = "hello world"; 
cout << c << endl;

終わり!

手動で管理する必要はありません。

于 2012-08-01T09:33:51.043 に答える