首页新闻找找看学习计划

c++指针的问题

0
悬赏园豆:5 [已解决问题] 解决于 2015-07-09 21:43
#include<iostream>
using namespace std;
int main()
{
int *p;
int a=10;
p=&a;
cout<<*(p+1)<<endl;
*(p+1)=10;
cout<<*(p+1);
return 0;
}

修改p+1指向的值,如果p+1所在的内存区域正好被其他程序引用。其他程序是不是可能跳bug。还有,我调试完毕后,p+1所指的内存值怎么处理?释放掉定义的变量资源,p+1处的四个字节就变成10了??

李辉健的主页 李辉健 | 初学一级 | 园豆:56
提问于:2014-10-12 15:51
< >
分享
最佳答案
0

楼主第一个问题:修改p+1指向的值,如果p+1所在的内存区域正好被其他程序引用。其他程序是不是可能跳bug?楼上也说了每个程序(进程)执行时,系统会为其开辟私有的内存空间,这个内存指的是虚拟内存,当进程要用到p+1处虚拟内存时,系统会将该内存地址映射到实际物理内存中,如果这个时候该物理内存正好被别的进程占用,那么这个时候系统有可能会保存那个进程状态然后将该块内存分配给这个进程用,也可能等那个程序用完,再分配给这个进程用,不过这期间都是很快的,所以给我们的感觉程序没有停顿的。

楼主第二个问题:还有,我调试完毕后,p+1所指的内存值怎么处理?释放掉定义的变量资源,p+1处的四个字节就变成10了??在c++中 只有三种情况下 要自己释放内存资源:1、用new动态申请一块内存 2、用malloc动态申请一块内存,3、某些系统API调用时会动态分配内存 因为以上三种情况都属于程序自身动态申请内存,所以释放的时候也要程序自身有相应的释放代码  而其他情况下都是系统为程序分配内存 而这些内存系统也会自动回收  不用我们自己添加回收代码

收获园豆:5
persistfly | 菜鸟二级 |园豆:207 | 2014-11-20 12:05
其他回答(7)
0

运行了代码后发现程序可以正常的运行,但是最后没法正常的结束.结果返回值为2293528。

所以是会有bug的,调试结束相对应的内存值是不应该有变化的。释放后应该也是没改变——个人观点,学习C++一年。

tianxia2s | 园豆:170 (初学一级) | 2014-10-12 18:26
0

看下这篇文章http://blog.csdn.net/embedded_hunter/article/details/6897027

用户程序运行时是在进程的地址空间(保护不和其他应用程序地址空间冲突),

这块空间在程序运行和结束都会进行相应的处理。

vinker | 园豆:7 (初学一级) | 2014-10-12 21:41
0

变量a用的内存是在站上, p+1改变的是a 地址的下一个四字节的内存, 如果改变了, 只会有内存越界异常, 这种错误会造成非常隐蔽的错误, 这样的代码最好不要写。

至于内存释放的话就不用说了, 栈上的内存是根本不用释放的,你非法的改变了内存的值, 不一定会是程序错误(release mode), 但是要是有错误, 如果是在大的项目里面, 就很难fix了。

源景 | 园豆:204 (菜鸟二级) | 2014-10-27 16:28
0

光这么写 不会出错 但free的时候 报错 理由自己琢磨 代码里面已经都有答案了

k4 | 园豆:202 (菜鸟二级) | 2014-11-07 15:15
0

不知道对一段本身就不合理的代码分析有什么意义。p+1明显是野指针,对野指针的操作结果在语法上是未知的,它的结果取决于编译器。

gig886 | 园豆:201 (菜鸟二级) | 2014-12-02 16:13
0

你好,这个问题首先要从c++编译过程的角度来考虑,调用函数最开始会将调用该地址的返回地址压栈,在声明了P指针变量之后,P指针先被压栈,之后声明的int a的变量也是作为局部变量在指针P之后压栈,下句代码令p+1其实是在p的地址+sizeof(int)访问修改到的地址应该是调用该函数时压栈的返回地址,所以程序如果IDE不作优化的话会直接崩溃

因此,该函数无法正常返回(如果该函数的调用方式 不为_cdelc 和 _stdcall应当另论)

Kimmin | 园豆:88 (初学一级) | 2015-03-16 16:04
0

main函数也是函数,函数里的变量都存在栈上,变量a存储在栈上,你的p指向了栈上内存,覆盖了其他的数据,这样的做法对不同编译器结果未知,看编译器怎么处理。这样的操作属于非法访问内存。栈上的内存有sp栈指针处理,你不能操作,不要试图“释放”野指针。

jiu~ | 园豆:444 (菜鸟二级) | 2015-05-09 22:01
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册