一个指针引发的错误,原因是什么?

来源:百度知道 编辑:UC知道 时间:2024/05/14 01:21:08
今天在做C指针练习的时候碰到一个错误,例子如下:
int i;
int *p = &i;
int k;

for (k = 0; k < 5; k++)
{
p++;
*p = 55;
printf("%d\n",*p);
}
-----------------------------------------------------------------
编译可以通过,可以得到可执行文件,执行也能输出结果,但最后会出现调用内存0x00000037错误(windows系统内存区域?)
我现在只能这么理解,指针对内存操作,要先对所欲操作的内存进行存储类型的声明,如int char等型,如果不是,像我上面的例子,就会执行到最后,系统弹出错误提示。
我debug到最后,看到反汇编执行到指令ret返回时,程序就跳到了0x00000037这个地方了。
不太明白具体的原因,希望高手解答,谢谢了!

首先应该指出的是,你在这段小程序中的指针用法是不正确的.
正确的方法是:指针所指向的空间必须通过系统提供的方法进得到,才能进行更改.
在上面这段程序中,指针所指向的地址空间,只有i是已经早请的空间,而后面由P++所得到的地址,系统并没有分配给这段程序使用,所以在对P所指向空间操作的时候会报错.

指针不能乱指, 操作系统对内存是有保护的。

指向未知区域肯定会出错。

呵呵,这就是缓冲区溢出攻击啊。
你这段代码成功的把内存中的你那个函数的堆栈部分破坏了个干净,当然会报错了。不过你所说的0000037不是什么内存地址,而是你那个*p = 55 干的好事。55 = 0x37啊。
而且,你看到的内存起点只是你当前进程的内存,跟系统内存没关系

你很有前途,继续继续,指针就是这么爽,用java的人是没这种机会的。不过要写正儿八经的代码,你这么干是不对的。用c和c++的人要清楚你的变量或类对象的内存究竟是指在哪里。

你对第一个地址的操作的是正确的,是你自己已经定义好的,但是后面的地址,就不一定是整型的,是无法预料的,只有声明好了,才能正确操作!

hehe 路过。。。
还是有指针好。。。

yaodekey所言甚善