我有點困惑,爲什麼下面的代碼崩潰:爲什麼這些指針會導致崩潰?
int main(){
int *a;
int *b;
*a = -2;
*b = 5; //This line causes a crash on my system.
return 0;
}
應該不是內存運行時,因爲申報前,會自動被分配給兩個指針和兩個整數?
或者你必須總是明確地分配內存嗎?
我有點困惑,爲什麼下面的代碼崩潰:爲什麼這些指針會導致崩潰?
int main(){
int *a;
int *b;
*a = -2;
*b = 5; //This line causes a crash on my system.
return 0;
}
應該不是內存運行時,因爲申報前,會自動被分配給兩個指針和兩個整數?
或者你必須總是明確地分配內存嗎?
不可以。您只聲明瞭指針,而不是它們指向的內容。指針被分配在堆棧上,並且因爲你沒有初始化它們,所以它們的值是垃圾。
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
指向。
不宜內存自動運行時,因爲申報前,分配給兩個指針和兩個整數?
我只看到你指定兩個指針。兩個整數在哪裏?
或者你必須總是明確地分配內存嗎?
指針必須指向東西。堆棧中的局部變量,或堆中的內存變量。
不int *聲明指向一個整數的指針嗎? – Josh 2013-04-28 21:59:01
是的,但它指向什麼整數? – 2013-04-28 22:00:27
@Josh考慮一句「她的狗」。這是對某人的狗的引用,但如果你沒有告訴我她是誰,它不會告訴我「給她的狗一條骨頭」。同樣,「指向int的指針」不會告訴系統它是哪個int。 – 2013-04-28 22:19:28
您剛剛聲明瞭指針,但尚未初始化它們。所以,你不能確定*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;
在此代碼:
int* a;
*a = -2;
a
是未初始化的指針,其中非關聯化生產未定義行爲,你是幸運的能夠觀察到的崩潰的應用程序。
您需要在之前初始化指針(使它指向有效的內存)取消對它的引用(即您使用*
之前,的引用操作):
int a;
int* pA = &a;
*pA = -2;
考慮
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。
「不應該自動分配內存」 - 你從哪裏得到這樣的想法?這當然是錯誤的。多少內存應該分配給一個*指針*,它可以指向任意長的'int'數組? – 2013-04-28 21:57:47
@代碼大師:我會在*之前強調*,而不是_must_。 ;-) – 2013-04-28 22:00:55
@PieterGeerkens好點(er) – 2013-04-28 22:15:13