2

私はこのようなものを持っています

char *temp, xyz;
temp = (char *)malloc(sizeof(somestring));

xyz = (char *) malloc(sizeof(temp));
xyz= strrchar(temp, "_"); // temp does not contain "_", but need to check for error validation

今私がfree(temp)をやろうとすると; そのクラッシュ;

どんな考えでも、私は初心者です。

4

2 に答える 2

14

最初の問題は、として宣言されておらず、単一のとして宣言されていることxyzです。char *char

次の変数宣言があるとします。

char *temp, xyz;
  • tempへのポインタcharです。
  • xyzのみcharです。

は両方の変数には適用され* ません。両方の変数がを指すようにするにcharは、次を使用します。

char *temp, *xyz;

sizeof次へ:との使用法を混同していますstrlensizeofタイプまたはそのタイプの変数が占めるサイズを示します。したがって、tempがのchar *場合、C文字列の長さではなくsizeof(temp)、ポインタのサイズになります。C文字列の長さを取得するには(たとえば、特定のC文字列をコピーするために必要なバッファサイズを取得するには)、を使用します。strlen

最後に、いくつかの重要なコードを省略しない限り、別の問題があります。単に使用mallocしても、新しく割り当てられたメモリでは何も実行されないため、次のようになります。

temp = (char *)malloc(sizeof(somestring));

temp初期化されていないメモリのビットを指します(これは、前述のように、sizeofではなくを使用しているために考えられるよりもおそらく小さいですstrlen)。次に、それが有効なC文字列であるかのように使用 します。これにより、自分のものではないメモリにアクセスする可能性があり、未定義の動作が発生します。tempstrchr

于 2012-08-19T18:51:59.000 に答える
0

私はそれを理解しました、私が間違っているなら私を訂正してください、xyzはそれが文字列tempの「_」を持っている場所を指しているだけです。臨時雇用者を解放するとすぐに、その場所は解放されました。しかし、xyzはまだその場所を指しており、すでに解放されています。それが私がxyzを解放する際にクラッシュした理由です。

于 2012-08-20T15:29:40.457 に答える