直接为C指针赋值

我刚刚开始学习C,我一直在使用MinGW for Windows运行一些简单的程序来理解指针的工作原理。 我尝试了以下方法:

#include  int main(){ int *ptr; *ptr = 20; printf("%d", *ptr); return 0; } 

正确编译但当我运行可执行文件时它不起作用 – 该值不会打印到命令行,而是我收到一条错误消息,指出.exe文件已停止工作。

但是,当我尝试将值存储在int变量中并将* ptr分配给该变量的内存地址时,如下所示:

 #include  int main(){ int *ptr; int q = 50; ptr = &q; printf("%d", *ptr); return 0; } 

它工作正常。

我的问题是,为什么我无法直接为指针设置文字值? 我已经在线查看教程以获得指针,其中大部分都是以与第二个示例相同的方式进行。

任何帮助表示赞赏。

问题是你没有初始化指针。 你已经创建了一个指向“你想要的任何地方”的指针 – 它可能是某个其他变量的地址,或代码的中间,或者根本没有映射的内存。

您需要在内存中的某处创建一个int变量,以使int *变量指向。

你的第二个例子是这样做的,但它做了其他与此无关的事情。 这是您需要做的最简单的事情:

 int main(){ int variable; int *ptr = &variable; *ptr = 20; printf("%d", *ptr); return 0; } 

这里, int变量没有被初始化 – 但这没关系,因为你只是要用20替换那里的任何值。 关键是指针被初始化为指向variable 。 事实上,如果你愿意,你可以只分配一些原始内存来指向:

 int main(){ void *memory = malloc(sizeof(int)); int *ptr = (int *)memory; *ptr = 20; printf("%d", *ptr); free(memory); return 0; } 

第一个计划与评论

 #include  int main(){ int *ptr; //Create a pointer that points to random memory address *ptr = 20; //Dereference that pointer, // and assign a value to random memory address. //Depending on external (not inside your program) state // this will either crash or SILENTLY CORRUPT another // data structure in your program. printf("%d", *ptr); //Print contents of same random memory address // May or may not crash, depending on who owns this address return 0; } 

第二个计划与评论

 #include  int main(){ int *ptr; //Create pointer to random memory address int q = 50; //Create local variable with contents int 50 ptr = &q; //Update address targeted by above created pointer to point // to local variable your program properly created printf("%d", *ptr); //Happily print the contents of said local variable (q) return 0; } 

关键是你不能使用指针,直到你知道它被分配给你自己管理的地址,或者通过指向你创建的另一个变量或者指向malloc调用的结果。

之前使用它是创建依赖于未初始化内存的代码,这些代码最多会崩溃,但有时候最糟糕的工作,因为随机内存地址恰好位于程序已经拥有的内存空间内。 如果它覆盖了你在程序中其他地方使用的数据结构,上帝会帮助你。

在第一个示例中,ptr尚未初始化,因此它指向未指定的内存位置。 当您为这个未指定的位置分配内容时,程序会爆炸。

在第二个例子中,当你说ptr =&q时设置地址,所以你没问题。