次のコードがクラッシュする理由について少し混乱しています。
int main(){
int *a;
int *b;
*a = -2;
*b = 5; //This line causes a crash on my system.
return 0;
}
宣言が原因で、実行前に 2 つのポインターと 2 つの整数にメモリが自動的に割り当てられるべきではありませんか?
それとも、常に明示的にメモリを割り当てる必要がありますか?
次のコードがクラッシュする理由について少し混乱しています。
int main(){
int *a;
int *b;
*a = -2;
*b = 5; //This line causes a crash on my system.
return 0;
}
宣言が原因で、実行前に 2 つのポインターと 2 つの整数にメモリが自動的に割り当てられるべきではありませんか?
それとも、常に明示的にメモリを割り当てる必要がありますか?
いいえ。ポインターが指すものではなく、ポインターを宣言しただけです。ポインタはスタックに割り当てられ、何も初期化していないため、それらの値はガベージです。
int main() {
int a = 7;
int *p_a; // p_a contains whatever garbage was on the stack at its
// location when main() is called. (Effectively points nowhere).
p_a = &a; // p_a points to (gets the address of) variable a, also on
// the stack.
printf("Before: a = %d\n", a); // prints 7
*p_a = -2;
printf("After: a = %d\n", a); // prints -2
return 0;
}
上記の例をコード化し、デバッガーでステップ実行します。p_a
指しているものが何を意味するかがわかります。
宣言が原因で、実行前に 2 つのポインターと 2 つの整数にメモリが自動的に割り当てられるべきではありませんか?
2 つのポインターを指定しているだけです。2 つの整数はどこにありますか?
それとも、常に明示的にメモリを割り当てる必要がありますか?
ポインタは何かを指す必要があります。スタック上のローカル変数、またはmalloc
ヒープからのメモリ。
検討
int m;
int n;
m = n;
使用しようとしてn
いますが、値を割り当てていないため、これは無効です。今:
int *a;
*a = -2;
同様に、使用しようとしているa
が、値を割り当てていないため、これは無効です。の値はa
ではなく、int
へのポインタint
です。例えば、
int someint;
a = &someint;
*a = -2;
に -2 を入れsomeint
ます。への代入がなければ、a
-2 を置く場所は決定できません。また、
a = malloc(sizeof(int));
*a = -2;
ここでa
は、ヒープ内のある場所のアドレスの値が与えられます。-2 はそのヒープの場所に入ります。
おそらく類推が役立つでしょう:
「彼女の犬」というフレーズを考えてみましょう。これは誰かの犬への言及ですが、彼女が誰であるかを私に伝えていない場合、「彼女の犬に骨を与えてください」と言っても意味がありません. 同様に、「int へのポインター」は、それがどの int であるかをシステムに通知しません。
ポインタを宣言したばかりですが、初期化していません。*b = 5
そのため、それがプログラムのクラッシュの原因であると確信することはできません。それもそうかもしれません*a = -2
。これを修正するには、ポインタも初期化する必要があります。
int aval = -2;
int bval = 5;
int *a = &aval; // declared and initialized pointers
int *b = &bval;
// Now you can change the value using the pointer
*a = 15;
*b = 20;
*a および *b ポインターが正しく初期化されていません。これを試してください:
int my_a;
int my_b;
int *a;
int *b;
a = &my_a; // init the pointer a to the direction of my_a int variable
b = &my_b;
*a = 3; // set the my_a value via pointer
*b = 2;