BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / soft-design / #21573同步于 2007/10/7
该镜像源已超过 30 天没有更新,可能在源站已被删除。
SoftDesign机器人发帖

[求助]一个关于字符数组变量的问题

epeeist
2007/10/7镜像同步10 回复
#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 望高手指教!
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
redfox机器人#1 · 2007/10/7
【 在 epeeist 的大作中提到: 】 : #include <stdio.h> : int main(void) : { : ................... scan不会检查你输入的长度的。系统没有报错,那是算你走运。现在没事,还个环紧可能就down了。建议使用fgets
epeeist机器人#2 · 2007/10/7
【 在 redfox 的大作中提到: 】 : scan不会检查你输入的长度的。系统没有报错,那是算你走运。现在没事,还个环紧可能就down了。建议使用fgets 谢谢! 我有一点还是不明白: 为什么在gcc中输入27个数不报错,而输入28个数却说:“sagmentation fault”。gcc对于这种情况是怎么处理的?这个临界数是随机的,还是gcc规定的?
coolfantasy机器人#3 · 2007/10/7
这个是不确定的 好像是越界超过了一个segment还是一个page才会崩掉 【 在 epeeist (BrianZheng) 的大作中提到: 】 : 谢谢! : 我有一点还是不明白: : 为什么在gcc中输入27个数不报错,而输入28个数却说:“sagmentation fault”。gcc对于这种情况是怎么处理的?这个临界数是随机的,还是gcc规定的? : ...................
epeeist机器人#4 · 2007/10/7
【 在 coolfantasy 的大作中提到: 】 : 这个是不确定的 好像是越界超过了一个segment还是一个page才会崩掉 也就是说gcc对于这种情况并没有什么特殊的处理,只有在发生缓冲区溢出时才会显示“segmentation fault”,是这样吗? 这个“segmentation fault”具体的是指什么?是“一页”大小的内存溢出了吗?
coolfantasy机器人#5 · 2007/10/7
呵呵 这个需要程序员来保证不发生越界的情况 具体是指什么记不太清了 以前在newsmth上看过 【 在 epeeist (BrianZheng) 的大作中提到: 】 : 也就是说gcc对于这种情况并没有什么特殊的处理,只有在发生缓冲区溢出时才会显示“segmentation fault”,是这样吗? : 这个“segmentation fault”具体的是指什么?是“一页”大小的内存溢出了吗?
coolfantasy机器人#6 · 2007/10/7
C/C++需要程序员去保证内存的使用不发生越界 我觉得这种临界值的考察其实没有什么意义 哪怕是只越了一个byte 这个程序也是危险的 因为就算不core掉 这个越界也有可能修改其他变量的值 造成难以寻找的bug 特别是在多进程/多线程的情况下 【 在 epeeist (BrianZheng) 的大作中提到: 】 : #include <stdio.h> : int main(void) : { : ...................
rebirthatsix机器人#7 · 2007/10/7
cool cool
CNLAS机器人#8 · 2007/10/7
re 【 在 rebirthatsix 的大作中提到: 】 : cool cool
epeeist机器人#9 · 2007/10/7
谢谢6楼! 我一开始以为gcc对于word[10]分配内存时按照某种规则来多分配几个内存(即规定了一个临界值,例如对word[10]规定这个临界值是27),只有当输入的个数超过这个临界值时,才会报错。这也是我为什么试着对不同的值(word[70]、word[80]、word[90]……)找所谓的临界值的原因,我原来想摸清gcc到底是怎么分配内存的。 现在开来自己真的很菜:问题不在于编译器,“segmentation fault”的提示来自linux系统而不是编译器。编译器只分配定长的内存(对于word[10]就只分配10个内存)。“segmentation fault”来自于内存区的碰撞冲突,具体的这个输入数据报错的临界值是多少是不确定的,正如楼上所说的有可能是11,也有可能是很大的一个数。 再次感谢各位的帮助!