讨教。
0012ff4c是变量a地址对吧。
b=b+1000000,能否告诉指针继续移动40万个字节?
那么005004c储存着什么东西呢?
此时再来一句*b=20;,应该是在005004c写入20。本人试了,出错,但没出现电脑死机等问题啊,不是说指针在错误位置写入不合适东西会很严重嘛?
若是b=b+1,应该是指针移动4个字节对吧?那也到达其它程序的地盘了吧,怎么就没出错?
解决方案
20
0012ff4c是变量a地址对吧。
对,是a的地址
b=b+1000000,能否告诉指针继续移动40万个字节?
应该是400万吧,呵呵
那么005004c储存着什么东西呢?
400万个字节约等于4M,八成已经超出你的栈区了,到达其他区了,里面存的东西是未知的
此时再来一句*b=20;,应该是在005004c写入20。本人试了,出错,但没出现电脑死机等问题啊,不是说指针在错误位置写入不合适东西会很严重嘛?
电脑死机太严重了,它说的严重还不至于到那个程度
若是b=b+1,应该是指针移动4个字节对吧?那也到达其它程序的地盘了吧,怎么就没出错?
b+1应该还没有到其他程序地盘,还在你当前的工作栈内,这部分内存现在没有任何保护,你可以随便写,这也是C语言的缺点吧
对,是a的地址
b=b+1000000,能否告诉指针继续移动40万个字节?
应该是400万吧,呵呵
那么005004c储存着什么东西呢?
400万个字节约等于4M,八成已经超出你的栈区了,到达其他区了,里面存的东西是未知的
此时再来一句*b=20;,应该是在005004c写入20。本人试了,出错,但没出现电脑死机等问题啊,不是说指针在错误位置写入不合适东西会很严重嘛?
电脑死机太严重了,它说的严重还不至于到那个程度
若是b=b+1,应该是指针移动4个字节对吧?那也到达其它程序的地盘了吧,怎么就没出错?
b+1应该还没有到其他程序地盘,还在你当前的工作栈内,这部分内存现在没有任何保护,你可以随便写,这也是C语言的缺点吧
40
0012ff4c是变量a地址对吧。
对
b=b+1000000,能否告诉指针继续移动40万个字节?
是
那么005004c储存着什么东西呢?
不知道
此时再来一句*b=20;,应该是在005004c写入20。本人试了,出错,但没出现电脑死机等问题啊,不是说指针在错误位置写入不合适东西会很严重嘛?
这种情况能否出错一种不确定行为,但每个程序的内存空间都是独自的,并不会影响到其他程序,只可能造成该程序崩溃
若是b=b+1,应该是指针移动4个字节对吧?那也到达其它程序的地盘了吧,怎么就没出错?
同上,地址空间都是虚拟独立的,你程序不会写到其他进程内,除非你使用专门API,至于没出错,上面也说了,是一种不确定行为
对
b=b+1000000,能否告诉指针继续移动40万个字节?
是
那么005004c储存着什么东西呢?
不知道
此时再来一句*b=20;,应该是在005004c写入20。本人试了,出错,但没出现电脑死机等问题啊,不是说指针在错误位置写入不合适东西会很严重嘛?
这种情况能否出错一种不确定行为,但每个程序的内存空间都是独自的,并不会影响到其他程序,只可能造成该程序崩溃
若是b=b+1,应该是指针移动4个字节对吧?那也到达其它程序的地盘了吧,怎么就没出错?
同上,地址空间都是虚拟独立的,你程序不会写到其他进程内,除非你使用专门API,至于没出错,上面也说了,是一种不确定行为
10
其实电脑开机后物理内存的每个字节都是可读写的,从来不会原因是所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时能否能发现并能否采取相应动作而已。操作系统管理内存的粒度不是字节而是页,一页通常为4KB。