2013-04-28 120 views
0

我有點困惑,爲什麼下面的代碼崩潰:爲什麼這些指針會導致崩潰?

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

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

    return 0; 
} 

應該不是內存運行時,因爲申報前,會自動被分配給兩個指針和兩個整數?

或者你必須總是明確地分配內存嗎?

+6

「不應該自動分配內存」 - 你從哪裏得到這樣的想法?這當然是錯誤的。多少內存應該分配給一個*指針*,它可以指向任意長的'int'數組? – 2013-04-28 21:57:47

+0

@代碼大師:我會在*之前強調*,而不是_must_。 ;-) – 2013-04-28 22:00:55

+0

@PieterGeerkens好點(er) – 2013-04-28 22:15:13

回答

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指向。


不宜內存自動運行時,因爲申報前,分配給兩個指針和兩個整數?

我只看到你指定兩個指針。兩個整數在哪裏?

或者你必須總是明確地分配內存嗎?

指針必須指向東西。堆棧中的局部變量,或堆中的內存變量。

+0

不int *聲明指向一個整數的指針嗎? – Josh 2013-04-28 21:59:01

+1

是的,但它指向什麼整數? – 2013-04-28 22:00:27

+1

@Josh考慮一句「她的狗」。這是對某人的狗的引用,但如果你沒有告訴我她是誰,它不會告訴我「給她的狗一條骨頭」。同樣,「指向int的指針」不會告訴系統它是哪個int。 – 2013-04-28 22:19:28

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; 
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; 
1

在此代碼:

int* a; 
*a = -2; 

a是未初始化的指針,其中非關聯化生產未定義行爲,你是幸運的能夠觀察到的崩潰的應用程序。

您需要在之前初始化指針(使它指向有效的內存)取消對它的引用(即您使用*之前,的引用操作):

int a; 
int* pA = &a; 
*pA = -2; 
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。

相關問題