设置一个值,指针会导致程序崩溃

问题描述:

#include <stdio.h> 

int main() 
{ 
    int* n; 
    *n = 20; // causes the crash 
    printf("%d\n", *n); 
    return 0; 
} 

但出于某种原因,如果我先设置INT * N =然后我就可以用*更改值N = 20 有没有这个原因?设置一个值,指针会导致程序崩溃

int i = 19; 
int* n; 
*n = i; 
*n = 20; 

编辑:谢谢大家帮助我从你的答案中学到了很多东西。

+5

它*访问一个空指针会导致程序崩溃*。 –

+1

你有一个指向无处的指针并存储它指向的值。问:你在哪里存储价值? – Olaf

+1

注意,第二个例子是一样异乎寻常的第一个例子坏,并调用未定义的行为,就像第 - 您使用的是未初始化的指针,当你这样做,可以发生任何事情。不能保证当你做错事情时程序会崩溃,但这是常见的反应。另一个常见的反应是它似乎有效,但它所做的不是你想要的。 –

int* n; 
*n = i; 

不,你所看到的(在你的两个例子中)是undefined behavior的结果。你上面没有初始化的指针指向一个有意义的记忆 - 通过应用*操作你解引用指针,告诉它写一些值到内存它,但因为你没有做它点到有效内存 - 您无法通过该指针进行写入。

这将是罚款

int x = 0; 
int* n = &x; // Now your pointer points to valid memory 
*n = 5; // Value of x will be 5 now 

是的,是有原因的。当你声明:

int* n; 

指针n显示无处。因此,当您尝试通过设置其值

*n = 20; 

程序崩溃,因为您试图访问显示无处指针的内容。


在另一方面,当你声明

int i = 19; 
int* n; 
n = &i; 

你使指针n展示给一些有效的地址。所以,当后来分配

*n = 20; 

你真正访问一个有效的内存地址的内容。

+0

你忘了让我指点我 –

+0

@Giorgi谢谢指出! – Marievi

+0

应该是'n =&i' – yano

你为什么不能设置使用该指针的值的原因是因为它没有指向的内存地址呢,你需要使用malloc和给它的东西指向。

希望这有助于:d

E.g

#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char *argv[]) 
{ 
    int *n; 

    n = malloc(sizeof(int)); 

    *n = 20; 

    printf("n = %d\n", *n); 

    system("pause"); 

    return 0; 
}