0

次のコードがクラッシュする理由について少し混乱しています。

int main(){
    int *a;
    int *b;

    *a = -2;
    *b = 5;  //This line causes a crash on my system.

    return 0;
}

宣言が原因で、実行前に 2 つのポインターと 2 つの整数にメモリが自動的に割り当てられるべきではありませんか?

それとも、常に明示的にメモリを割り当てる必要がありますか?

4

5 に答える 5

3

いいえ。ポインターが指すものではなく、ポインターを宣言しただけです。ポインタはスタックに割り当てられ、何も初期化していないため、それらの値はガベージです。

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ヒープからのメモリ。

于 2013-04-28T21:57:15.830 に答える
1

検討

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 であるかをシステムに通知しません。

于 2013-04-28T22:12:33.573 に答える
0

ポインタを宣言したばかりですが、初期化していません。*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;
于 2013-04-28T21:59:39.937 に答える
0

*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;
于 2013-04-28T21:59:53.843 に答える