为什么这些指针会导致崩溃?
我有点困惑,为什么下面的代码崩溃:为什么这些指针会导致崩溃?
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