返回信息流#include <stdio.h>
int main(void)
{
char word[10] = "";
scanf("%s", word);
printf("%s\n", word);
return 0;
}
这个程序在VC中编译运行时:
输入:123456789
输出:123456789
正常
输入:1234567890
输出:1234567890
不正常,提示栈区破坏。
(本人认为是由于word[9]=0,编译器只好在word[10]中写入'\0',出现错误)
而这个程序在Redhat 9.0的环境下,用gcc编译运行时:
输入:123456789
输出:123456789
正常
输入:1234567890
输出:1234567890
正常
输入:123456789012345678901234567 //27个数
输出:123456789012345678901234567
正常
输入:1234567890123456789012345678 //28个数
输出:1234567890123456789012345678
segmentation fault!
27为临界值
我想问一下gcc对于这种定长字符数组的空间是怎么分配的?这与gcc编译器的版本有关吗?
另外,我把word[10]改为word[4],则临界值为7
word[70] 91
word[80] 91
word[90] 107
望高手指教!
这是一条镜像帖。来源:北邮人论坛 / soft-design / #21573同步于 2007/10/7
该镜像源已超过 30 天没有更新,可能在源站已被删除。
SoftDesign机器人发帖
[求助]一个关于字符数组变量的问题
epeeist
2007/10/7镜像同步10 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
【 在 epeeist 的大作中提到: 】
: #include <stdio.h>
: int main(void)
: {
: ...................
scan不会检查你输入的长度的。系统没有报错,那是算你走运。现在没事,还个环紧可能就down了。建议使用fgets
【 在 redfox 的大作中提到: 】
: scan不会检查你输入的长度的。系统没有报错,那是算你走运。现在没事,还个环紧可能就down了。建议使用fgets
谢谢!
我有一点还是不明白:
为什么在gcc中输入27个数不报错,而输入28个数却说:“sagmentation fault”。gcc对于这种情况是怎么处理的?这个临界数是随机的,还是gcc规定的?
这个是不确定的 好像是越界超过了一个segment还是一个page才会崩掉
【 在 epeeist (BrianZheng) 的大作中提到: 】
: 谢谢!
: 我有一点还是不明白:
: 为什么在gcc中输入27个数不报错,而输入28个数却说:“sagmentation fault”。gcc对于这种情况是怎么处理的?这个临界数是随机的,还是gcc规定的?
: ...................
【 在 coolfantasy 的大作中提到: 】
: 这个是不确定的 好像是越界超过了一个segment还是一个page才会崩掉
也就是说gcc对于这种情况并没有什么特殊的处理,只有在发生缓冲区溢出时才会显示“segmentation fault”,是这样吗?
这个“segmentation fault”具体的是指什么?是“一页”大小的内存溢出了吗?
呵呵 这个需要程序员来保证不发生越界的情况
具体是指什么记不太清了 以前在newsmth上看过
【 在 epeeist (BrianZheng) 的大作中提到: 】
: 也就是说gcc对于这种情况并没有什么特殊的处理,只有在发生缓冲区溢出时才会显示“segmentation fault”,是这样吗?
: 这个“segmentation fault”具体的是指什么?是“一页”大小的内存溢出了吗?
C/C++需要程序员去保证内存的使用不发生越界
我觉得这种临界值的考察其实没有什么意义 哪怕是只越了一个byte 这个程序也是危险的
因为就算不core掉 这个越界也有可能修改其他变量的值 造成难以寻找的bug 特别是在多进程/多线程的情况下
【 在 epeeist (BrianZheng) 的大作中提到: 】
: #include <stdio.h>
: int main(void)
: {
: ...................
谢谢6楼!
我一开始以为gcc对于word[10]分配内存时按照某种规则来多分配几个内存(即规定了一个临界值,例如对word[10]规定这个临界值是27),只有当输入的个数超过这个临界值时,才会报错。这也是我为什么试着对不同的值(word[70]、word[80]、word[90]……)找所谓的临界值的原因,我原来想摸清gcc到底是怎么分配内存的。
现在开来自己真的很菜:问题不在于编译器,“segmentation fault”的提示来自linux系统而不是编译器。编译器只分配定长的内存(对于word[10]就只分配10个内存)。“segmentation fault”来自于内存区的碰撞冲突,具体的这个输入数据报错的临界值是多少是不确定的,正如楼上所说的有可能是11,也有可能是很大的一个数。
再次感谢各位的帮助!