我对以下代码崩溃的原因感到有点困惑:
int main(){
int *a;
int *b;
*a = -2;
*b = 5; //This line causes a crash on my system.
return 0;
}
由于声明,不应该在运行时自动为两个指针和两个整数分配内存吗?
或者你必须总是明确地分配内存吗?
答案 0 :(得分: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
指向的内容的意思。
由于声明,不应该在运行时自动为两个指针和两个整数分配内存吗?
我只看到你指定了两个指针。两个整数在哪里?
或者你必须总是明确地分配内存吗?
指针必须指向某事。堆栈上的局部变量,或堆中的malloc
'内存。
答案 1 :(得分:1)
在此代码中:
int* a;
*a = -2;
a
是一个未初始化的指针,解除引用会产生 未定义的行为 ,您很幸运能够将其视为应用程序崩溃。
在取消引用之前(即在使用*
,取消引用运算符之前),您需要初始化指针(使其指向有效内存):
int a;
int* pA = &a;
*pA = -2;
答案 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。
答案 3 :(得分: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;
答案 4 :(得分: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;