私はCに非常に慣れていませんが、なぜこのプログラムが壊れているのかわかりません。に関係する行を削除すると、プログラムはコンパイルされて実行されますi
が、を割り当てると、プログラムを中断せずi
に何も割り当てることができなくなり*ptr
ます。
int main(void)
{
int i;
int *ptr;
i = 2;
*ptr = 5;
printf("%d",*ptr);
}
ポインターを初期化されていない値のままにします。したがって、逆参照 ( *ptr
) すると、メモリ内の任意の場所にアクセスし、セグメンテーション フォールトが発生します。
変数のアドレス ( など) または新しく割り当てられたメモリ ( など) をそれ自体 ( ではなく)ptr
に割り当てることによって、何かを指します。ptr
*ptr
&i
malloc(sizeof(int))
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
}
フリーが出たことにも注目!!!
ptr を宣言しましたが、何かを指すようにしませんでした。次に、それが指すものに書き込もうとしました。これは決して良い考えではありません。次の行を追加して、ptr が i を指すようにしてみてください。
ptr = &i;
*ptr に書き込もうとする前に
Cでポインタを使用する前に、ポインタを既存のメモリブロックに設定するか、このようにメモリを割り当てる必要があります。
int *ptr = (int *)malloc(sizeof(int));