[英]Directly assigning values to C Pointers
我刚刚开始学习 C,我一直在使用 MinGW for Windows 运行一些简单的程序,以了解指针的工作原理。 我尝试了以下方法:
#include <stdio.h>
int main(){
int *ptr;
*ptr = 20;
printf("%d", *ptr);
return 0;
}
它编译正确,但是当我运行可执行文件时它不起作用 - 该值没有打印到命令行,而是收到一条错误消息,指出 .exe 文件已停止工作。
但是,当我尝试将值存储在 int 变量中并将 *ptr 分配给该变量的内存地址时,如下所示:
#include <stdio.h>
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 <stdio.h>
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 <stdio.h>
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 时设置了地址,所以您没问题。
您可以为指针设置一个值,但是一旦您使用“new”为其请求内存。 这是您的代码的外观
int main(){
int *ptr;
ptr = new int; //ask for memory
*ptr = 20;
printf("%d", *ptr);
return 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.