12

私はCに非常に慣れていませんが、なぜこのプログラムが壊れているのかわかりません。に関係する行を削除すると、プログラムはコンパイルされて実行されますiが、を割り当てると、プログラムを中断せずiに何も割り当てることができなくなり*ptrます。

int main(void)
{
    int i;
    int *ptr;

    i = 2;
    *ptr = 5;
    printf("%d",*ptr);
}
4

4 に答える 4

11

ポインターを初期化されていない値のままにします。したがって、逆参照 ( *ptr) すると、メモリ内の任意の場所にアクセスし、セグメンテーション フォールトが発生します。

変数のアドレス ( など) または新しく割り当てられたメモリ ( など) をそれ自体 ( ではなく)ptrに割り当てることによって、何かを指します。ptr*ptr&imalloc(sizeof(int))

于 2012-07-02T16:30:22.707 に答える
4

Cの答えは次のとおりです。

int main(void) {
    int i;
    int * ptr = (int *)malloc(sizeof(int));

    i = 2;
    *ptr = 5;     
    printfn("%d",*ptr); 
    free(ptr);
}

または、 i および *ptr 割り当て行に次のようなものを使用できます。

int main(void) {
    int i;
    int * ptr;

    i = 2;
    ptr = &i;     
    printfn("%d",*ptr); // should print 2
}

フリーが出たことにも注目!!!

于 2012-07-02T16:31:31.260 に答える
1

ptr を宣言しましたが、何かを指すようにしませんでした。次に、それが指すものに書き込もうとしました。これは決して良い考えではありません。次の行を追加して、ptr が i を指すようにしてみてください。

ptr = &i;

*ptr に書き込もうとする前に

于 2012-07-02T16:31:35.973 に答える
0

Cでポインタを使用する前に、ポインタを既存のメモリブロックに設定するか、このようにメモリを割り当てる必要があります。

int *ptr = (int *)malloc(sizeof(int));
于 2012-07-02T16:30:00.370 に答える