0

我对以下代码崩溃的原因感到有些困惑:

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

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

    return 0;
}

由于声明,不应该在运行时之前为两个指针和两个整数自动分配内存吗?

还是必须始终显式分配内存?

4

5 回答 5

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堆中的内存。

于 2013-04-28T21:57:15.830 回答
1

在这段代码中:

int* a;
*a = -2;

a是一个未初始化的指针,取消引用会产生未定义的行为,幸运的是,您能够将其视为应用程序的崩溃。

您需要在取消引用之前初始化指针(使其指向有效内存)(即在使用之前*取消引用运算符):

int a;
int* pA = &a;
*pA = -2;
于 2013-04-28T22:06:03.540 回答
1

考虑

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。

于 2013-04-28T22:12:33.573 回答
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;
于 2013-04-28T21:59:39.937 回答
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;
于 2013-04-28T21:59:53.843 回答