为什么这些指针会导致崩溃?

时间:2013-04-28 21:55:59

标签: c memory-management

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

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

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

    return 0;
}

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

或者你必须总是明确地分配内存吗?

5 个答案:

答案 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;