4

このコードはセグメンテーション違反を引き起こします:

int main(){

    char *p;
    char a[50] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
    p = (char *)malloc(50*sizeof(char));

    if(!p){
            cout << "Allocation Failure";
            cout << "\n";
    }
    else{
            cout << "Allocation Success";
            cout << "\n";
            p = a;
            cout << p;
            cout << "\n";
            free(p);
    }

    return 0;
}

このプログラムを実行した後の出力は次のとおりです。

Allocation Success

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

Segmentation fault

バグを見つけることができません。理由は何でしょうか?

4

5 に答える 5

12

これ:

p = a;

ポイントされたメモリの内容ではなく、 ポインタをコピーします。pここで、配列の最初の要素を指しaます。したがって、そうするときはfree(p)、動的でない配列を解放しようとしますが、これは意味がありません。1

strncpy()文字列をコピーするために調査する必要があります。


1.そしてそれはまたメモリリークを引き起こします。

于 2012-06-17T23:50:04.133 に答える
10

いずれかのメソッドfreeを使用して割り当てられなかったメモリのブロックを呼び出しています。malloc

実行する場合:スタック配列によって使用されるメモリp = aに割り当てます。そのメモリはを使用して割り当てられなかったため、を使用して解放することはできません。pamallocfree

さらに、その再割り当てにより、最初に割り当てて割り当てたブロックを追跡できなくmallocなりp、メモリリークが発生します。

于 2012-06-17T23:50:09.910 に答える
0
p = a; // p points a

この行を実行すると、 p は const string ( ) を指しているはずchar *です。またはfree()を呼び出して得られないものは何も取得できません。この例では const 文字列を使用しようとしているため、エラーが発生します。malloccallocfree()

于 2012-06-18T06:31:39.413 に答える
0

あなたは実際には memcpy(p,a,50); を意味していました。p=a ではありません。C には文字列データ型がないことを思い出してください。

于 2012-06-18T00:26:13.753 に答える
0

char a[50]スタックに 50 文字の配列を割り当てます。aしたがって、スタック上のアドレスを指します。

p = aaと同じアドレスを指すようにpを設定します。したがって、 の後、p はスタック上のアドレスを指します。pにはaddressが含まれていることを思い出してください。p = a

その後、free(p)スタック上のメモリ領域を解放しようとしますが、これは違法です。malloc() から取得したメモリのみを解放できます。

于 2012-06-17T23:53:06.920 に答える