问题描述
我在Win8中 使用codeblock编写了一段程序。使用的是GCC 4.7 & 4.8 编译器:
#include <iostream>using namespace std;int main(){ int *i=0; cout<< 'Hello world!' << endl; return 0;}
程序可以运行,输出:Hello world。很奇怪的是一旦加入指针赋值语句,编译组建通过,但无法运行。
int main(){ int *i=0; *i = 9; cout<< 'Hello world!' << endl; return 0;}
控制台上显示为:Process returned -1073741819 (0xC0000005) execution time : 1.453 s使用VC++ 6.0 出现了同样的现象
在百度上也没搜到结果。
问题解答
回答1:int *i = 0;
这个语句是相当于把int* 的指针变量 i 赋值为0,而不是将int* 的指针 i 指向 0这个常量所在的内存地址,也就是相当于是这样的代码:
int *i;i=0;
而不是
int *i;*i= 0; //不过这样的用法也不规范!这句代码的作用是为指针 i所指向的内存赋值, //但是因为i 指向未知内存,因为前面只是进行了初始化,所以这时候是一个野指针 //为野指针指向的内存赋值,显然会导致内存错误!
你的理解是不是这样的?@changqngd
回答2:刚才运行了几次又想了一下,终于想通了。错在:int *i=0; //这里给指针赋了一个空地址 *i = 9; //*i是空地址指针,不能使用改为如下就正确了:
int ival=90;int *i = &ival;*i=9;

