将值设置为指针会导致程序崩溃

时间:2016-04-26 16:58:31

标签: c

#include <stdio.h>

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

但出于某种原因,如果我首先设置int * n = i,那么我可以用* n = 20更改该值 有这个原因吗?

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

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

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

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

int* n;

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

设置其值时
*n = 20;

当您尝试访问无处显示指针的内容时程序崩溃。

另一方面,当你宣布

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

您将指针 n 显示为某个有效地址 。所以当你之后你分配

*n = 20;

您实际访问有效内存地址的内容

答案 2 :(得分:-1)

你不能使用该指针设置值的原因是因为它还没有指向内存地址,你需要使用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;
}