2013-04-28 134 views
0

我有点困惑,为什么下面的代码崩溃:为什么这些指针会导致崩溃?

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

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

    return 0; 
} 

应该不是内存运行时,因为申报前,会自动被分配给两个指针和两个整数?

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

+6

“不应该自动分配内存” - 你从哪里得到这样的想法?这当然是错误的。多少内存应该分配给一个*指针*,它可以指向任意长的'int'数组? – 2013-04-28 21:57:47

+0

@代码大师:我会在*之前强调*,而不是_must_。 ;-) – 2013-04-28 22:00:55

+0

@PieterGeerkens好点(er) – 2013-04-28 22:15:13

回答

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指向。


不宜内存自动运行时,因为申报前,分配给两个指针和两个整数?

我只看到你指定两个指针。两个整数在哪里?

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

指针必须指向东西。堆栈中的局部变量,或堆中的内存变量。

+0

不int *声明指向一个整数的指针吗? – Josh 2013-04-28 21:59:01

+1

是的,但它指向什么整数? – 2013-04-28 22:00:27

+1

@Josh考虑一句“她的狗”。这是对某人的狗的引用,但如果你没有告诉我她是谁,它不会告诉我“给她的狗一条骨头”。同样,“指向int的指针”不会告诉系统它是哪个int。 – 2013-04-28 22:19:28

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; 
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; 
1

在此代码:

int* a; 
*a = -2; 

a是未初始化的指针,其中非关联化生产未定义行为,你是幸运的能够观察到的崩溃的应用程序。

您需要在之前初始化指针(使它指向有效的内存)取消对它的引用(即您使用*之前,的引用操作):

int a; 
int* pA = &a; 
*pA = -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。

相关问题