2

私は簡単なコードを持っています、

#include "stdafx.h"
#include <malloc.h>
int main()
{
  char *p = (char*) malloc(10);
  p = "Hello";

  free(p);

  return 0;
}

このコードは、終了時に実行時例外を発生させています。以下は最もスニッピーなエラーです、


Microsoft VisualC++デバッグライブラリ

デバッグアサーションに失敗しました!

プログラム:... \ mydocuments \ visual studio 2010 \ Projects \ samC \ Debug \ samC.exeファイル:f:\ dd \ vctools \ crt_bld \ self_x86 \ crt \ src \ dbgheap.c行:1322

式:_CrtIsValidHeapPointer(pUserData)

プログラムがアサーションの失敗を引き起こす可能性がある方法については、アサーションに関するVisualC++のドキュメントを参照してください。

(アプリケーションをデバッグするには、[再試行]を押します)

再試行を中止無視する

4

5 に答える 5

6

p = "Hello";文字列リテラルをpポイントし、以前に割り当てられた値を破棄します。free文字列リテラルは使用できません。変更することはできません。

pその文字列を保持したい場合は、

char* p = "Hello";

また

char p[] = "Hello";

あなたがそれを変更することを計画している場合。

どちらも必要ありませんfree

于 2013-01-08T12:18:04.987 に答える
5

これは、mallocによってcharポインタに割り当てられたメモリに文字列を書き込む方法です。

strcpy(p, "Hello");

行を置き換えます

p = "Hello";

1つで&あなたのstrcpyプログラムはうまく動作します。

また、する必要があります

#include <string.h>

malloc割り当てられたメモリへのポインタを返します。アドレスが95000(私が引き出した乱数だけ)だとします。

したがって、mallocの後に--pはアドレスを保持します95000 。pを含む95000のは、メモリを使い終わったときに解放するために渡す必要のあるメモリアドレスです。

ただし、次の行p = "Hello";では、文字列リテラル「Hello」(アドレスに存在すると言います)のアドレス25000をpに入れます。

したがって、実行すると、mallocによって割り当てられなかったものfree(p)を解放しようとします。25000

OTOH、あなたがするときstrcpy、あなたは文字列「Hello」をp(すなわち)で始まるアドレスにコピーします95000。strcpyの後にp残ります。95000

そしてfree(p)、適切なメモリを解放します。

mallocを避けて使用することもできます

char *p = "Hello";

ただし、このメソッドでは、文字列を変更することはできません。

つまり、この後*p = 'B'、文字列をに変更するBelloと、未定義の操作になります。これは、そのmalloc方法では当てはまりません。

代わりに、

char p[] = "Hello";

また

char p[10] = "Hello";

freedである必要のない変更可能な文字列を取得します。

于 2013-01-08T12:21:39.410 に答える
2
p = "Hello";
free(p);

は静的に割り当てられるためHello、できませんfree。ポインタを別のポインタに変更してポインタを捨てるためだけにメモリを割り当てる理由はわかりませんが、効果はありません。これを行う場合:

int i = 1;
i = 2;

iかつて保持していた記憶がなく1、今保持してい2ます。同様に、p割り当てたメモリへのポインタをかつて保持していたメモリはありません。現在、不変定数へのポインタを保持しています。

于 2013-01-08T12:18:44.987 に答える
1

これはいいものです。charシーケンス「hello」は一定であるため、ヒープにもスタックにもnietherが配置されますが、.bss/.dataセグメントに配置されます。実行するときはp="hello"、を使用してヒープに割り当てたメモリではなく、そのセグメント内の文字列helloのアドレスをpにポイントさせますmalloc。pに移動するfreeと、.bss / .dataセグメントのメモリを解放しようとし、当然失敗します。

おそらく必要なのはstrcpy(p,"hello");、「hello」のすべての文字を調べて、pが指すメモリに配置するようなものです。基本的に、メモリアドレスpに文字列「hello」のコピーを作成します。

于 2013-01-08T12:23:35.397 に答える
0

文字列「Hello」の内容を割り当てたメモリにコピーする場合は、次を使用する必要がありますstrcpy

strcpy(p, "Hello");

この線

p = "Hello";

文字列リテラル「Hello」のアドレスをポインタに割り当て、pから返されたポインタ値を上書きします。mallocしたがって、を呼び出すとクラッシュしますfree

于 2013-01-08T13:51:29.210 に答える