鱼C论坛

 找回密码
 立即注册
查看: 4178|回复: 5

有关数组溢出问题

[复制链接]
发表于 2012-12-26 05:00:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 喜欢散步 于 2012-12-26 05:18 编辑

我想问一下,如果我定义了一个数组  char  b[5], 当我调用 scanf("%s", b); 的时候
我输入:  abcde 共五个字符, 会不会出现溢出?  
因为我在想, 上面这个字符串数组, 要不要保留一个位置给空字符 '\0' ?
如果这样定义: char b[ ] = "c program" ; 那它占几个字节?书上说是10个!  说系统会自动加上一个字节 : '\0' 。
所以我就在想, 如果定义了一个 char [5] 用来存放字符串, 要不要留一个字节给系统存放 字符串结束标志 '\0'  ???


char b[5] = {'a', 'b', 'c', 'd'}  是不是可以写成 char b[ ] = "abcd"    ? 那前者与后者在系统中占用的字节数是一样的吗?
是不是b [5] 就是 5个字节, 而b [] = "abcd" 就占6个了? 那为什么不在b[5]中的字符串后面也加一个字符串结束标志  '\0' ???
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-12-26 11:45:20 | 显示全部楼层
1,书上说的没错,scanf("%s", b); 调试的时候确实发现b[5] = '\0'。
2,char b[5] = {'a', 'b', 'c', 'd'}  是不是可以写成 char b[ ] = "abcd"  显然不行,前者b[4]是没有初始化的,而后者b[4] = '\0';
3,有以前分析,两者占用字节数是相同的。
4,b[5]占5个字节(char b[5]才是)。b[] = "*****",这里要看里面字符数了,b[] = "abcd"占5个。
5,==》那为什么不在b[5]中的字符串后面也加一个字符串结束标志  '\0' ???
这是初始化的实现不同

小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-4-22 11:15:35 | 显示全部楼层

各种误导 ...
1 b[5]已经是数组越界了 是错误的
2 两者一样都是5个自己字节 都是第5个元素b[4] 为0 没区别
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-5-21 10:12:22 | 显示全部楼层
我是师兄 发表于 2013-4-22 11:15
各种误导 ...
1 b[5]已经是数组越界了 是错误的
2 两者一样都是5个自己字节 都是第5个元素b[4] 为0 没区 ...

n久没来这了,还有人回我的帖子。。。。
1,我们说的不是一回事,谁告诉你b[5]就是对这个数组的访问,b[5]只是偏移。这么访问的确越界,但是不代表这么写就有错!也不代表内存访问一定错误,因为调试结果的确是这样的。
2,如果看结果都是一样的,但是这是编译器的作用,
0040D708   mov         byte ptr [ebp-8],61h
0040D70C   mov         byte ptr [ebp-7],62h
0040D710   mov         byte ptr [ebp-6],63h
0040D714   mov         byte ptr [ebp-5],64h
0040D718   xor         eax,eax
0040D71A   mov         byte ptr [ebp-4],al
谁告诉你在你没有初始化的时候,一定就是0了?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-5-21 11:43:28 | 显示全部楼层
suiyan 发表于 2013-5-21 10:12
n久没来这了,还有人回我的帖子。。。。
1,我们说的不是一回事,谁告诉你b[5]就是对这个数组的访问,b[ ...

汗 数组越界的错误是什么错误你都没弄明白吧
数组越界 会访问的是什么内存是不可靠的 有时候会修改其他对象 有时候 会奔溃
b[5] 越界 没崩溃 你说 没问题 笑话

char b[5] = {'a', 'b', 'c', 'd'}
你认为这样值初始化 前面4个元素 数组第5个元素没初始化 对吗
胡扯 C语言 学得不扎实 重修去
这样初始化 第5个元素必然是 0 没有第二种可能
C标准要求编译器必须如此实现

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-5-21 12:15:21 | 显示全部楼层
当数组中某些元素没有赋值时系统自动识别为0即'\0'   但有的书上说没有定义成static就没赋值  这个比较矛盾、、LZ 看书这么仔细  以后肯定是C的大大神级别   楼主加油,鱼C加油!我们都看好你哦!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-8-13 00:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表