当前位置: 技术问答>linux和unix
问一个简单问题,但是理解不了为什么?牛人过来看看
来源: 互联网 发布时间:2016-03-18
本文导语: char *p="123456789"; char h[4]="123"; strcpy(h,p); 运行结果是段错误 把char h[4]改成char h[5] 运行成功,都是数组越界为什么会有如此的差异呢? | 都是内存溢出。 不要钻这样的牛角见. 运行的情况和和内存布局有...
char *p="123456789";
char h[4]="123";
strcpy(h,p);
运行结果是段错误
把char h[4]改成char h[5]
运行成功,都是数组越界为什么会有如此的差异呢?
|
都是内存溢出。
不要钻这样的牛角见.
运行的情况和和内存布局有关,都存在很大的不确定性。
char h[4]的情况,在我机器上也不产生段错误。存在随即性。
不要钻这样的牛角见.
运行的情况和和内存布局有关,都存在很大的不确定性。
char h[4]的情况,在我机器上也不产生段错误。存在随即性。
|
linux下分配内存是按页分配的。 也就是说即使你分配一个字节的内存, 系统也会分配出一页内存(4K)。
当内存被破坏了,不见得立刻就能反应出问题来。
当内存被破坏了,不见得立刻就能反应出问题来。
|
只是随机问题,溢出不报错不代表没有溢出
|
出现段错误?
可能吗?
你这样使用strcpy本身就存在危险!
可能吗?
你这样使用strcpy本身就存在危险!
|
肯定过界,但不一定反映出来。用efence或valgrind一查就出来了。
|
不同版本的内核所显示的结果是不一样的.
我在redhat linux9 中运行的话是没有任何错误提示的,比如段错误.
但是在centOS中,不管改成h[4]还是h[5]运行的话都是段错误.
也就是说redhat中的内核的安全检查没有CentOS的严格.
内核 gcc
redhat 2.4.20-8 3.2.2
CentOS 2.6.8-53.e15 4.1.2
我在redhat linux9 中运行的话是没有任何错误提示的,比如段错误.
但是在centOS中,不管改成h[4]还是h[5]运行的话都是段错误.
也就是说redhat中的内核的安全检查没有CentOS的严格.
内核 gcc
redhat 2.4.20-8 3.2.2
CentOS 2.6.8-53.e15 4.1.2
|
CentOS就是基于Redhat,应该是内核和gcc的版本问题导致的差异吧
|
随机的,这样用本来就是很危险的