#include <stdio.h>
int main(){
int* p;
(*p) = 5;
printf("%i\n", *p);
return 0;
}
如果我编译并运行它,我收到错误“test.exe not working”,这是因为编译器吗?
答案 0 :(得分:3)
您正在写入未初始化的内存。操作系统正在查杀您的应用程序,以保护自己免受笨拙的内存覆盖攻击。试试这个:
#include <stdio.h>
int main(){
int r; // Let's give p something valid to look at
int* p = &r; // Assign the address of r into the p pointer.
(*p) = 5; // Write to what is pointed to by p (into r)
printf("%i\n", *p); // print it.
return 0; // return all is well.
}
这显示了如何以更正确的方式使用指针。
答案 1 :(得分:2)
指针不指向您拥有的任何内存,因此解除引用它的行为是未定义的。
答案 2 :(得分:2)
在int* p;
中,您定义了一个对象p
,它是指向int
的指针。此声明创建指针但不为其指定任何值。定义指针不会自动创建它指向的东西。你必须单独做。
在(*p) = 5;
中,您要将5
放在p
点的位置。但是,p
尚未分配任何值,因此它不是有效指针。此时发生的事情是不受控制的。根据您报告的消息,似乎未初始化的指针包含指向无效地址的位,因此尝试将5
写入该位置会导致陷阱,系统通过说您的程序向您报告没有用。
例如,你可以这样做:
int x = 4; // Create an int object and put 4 in it.
int *p = &x; // Create a pointer-to-int and put the address of x in it.
*p = 5; // Put 5 in the int pointed to by p.
答案 3 :(得分:0)
通过int* p
声明一个指针,一个用于保存地址的变量。由于变量是本地保存的并且具有自动存储持续时间,因此该变量未被初始化,因此保留了一些未定义的值。通过取消引用此指针,您将向所提到的未定义地址写入值。对你来说重要的一点是,自动存储的局部变量永远不会被初始化。
正确的方法是分配所需的内存并将分配的内存的起始地址分配给指针。