我对以下代码崩溃的原因感到有些困惑:
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
。
由于声明,不应该在运行时之前为两个指针和两个整数自动分配内存吗?
我只看到你指定了两个指针。这两个整数在哪里?
还是必须始终显式分配内存?
指针必须指向某些东西。堆栈上的局部变量,或malloc
堆中的内存。
在这段代码中:
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
. 如果没有分配 to a
,放置 -2 的位置是无法确定的。还,
a = malloc(sizeof(int));
*a = -2;
这里,a
给出堆中某个位置的地址值;-2 进入该堆位置。
也许一个类比会有所帮助:
考虑一下“她的狗”这个短语。这是对某人的狗的引用,但如果你没有告诉我她是谁,那么告诉我“给她的狗一根骨头”是行不通的。同样,“指向 int 的指针”不会告诉系统它是哪个 int。
您刚刚声明了指针,但尚未初始化它们。因此,您不能确定这*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;