鱼C论坛

 找回密码
 立即注册
查看: 4099|回复: 7

字符数组长度问题

[复制链接]
发表于 2013-1-13 20:34:39 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 魁拔 于 2013-1-13 20:42 编辑

#include <stdio.h>
#include <string.h>
int main()
{
        char a[1];
        strcpy( a, "avc" );
        printf( "%c", a[2] );
        return 0;
}
大家看看,定义的字符数组长度是 1,但是后面的 a[2] 却没有问题?这是为什么?字符串长度是 1 ,用strcpy函数给字符数组赋值也没有出现错误,赋值的字符串长度为 3,软件没报错正常运行,求解?

小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-1-13 22:25:36 | 显示全部楼层
本帖最后由 思无邪 于 2013-1-13 22:38 编辑

因为a[2],表示&a的后一个字节地址,这个当然没错误。没有报错,因为编译器认为C++程序员知道自己在干什么并且编写的是正确的代码。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-1-14 21:57:35 | 显示全部楼层
跟平台有关系吧,如果在linux上,访问没有开辟的内存是回程序出错的。但是编译没问题
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-1-14 22:38:10 | 显示全部楼层
编译不会出问题,但是运行时可能出问题。局部变量是存放在函数的栈空间里的,这种处理会造成栈溢出,我运行了一下,运行时系统提示栈溢出。
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2013-1-14 23:04:01 | 显示全部楼层

好强大的VC++6.0,我的什么都没有提示,输出竟然是正常的。
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2013-1-14 23:06:01 | 显示全部楼层
思无邪 发表于 2013-1-13 22:25
因为a[2],表示&a的后一个字节地址,这个当然没错误。没有报错,因为编译器认为C++程序员知道自己在干什么并 ...

其实我是说 a[2] 这个元素在数组中根本不存在,因为数组长度是 1,但是软件没有报错,而且正常运行,不知道是什么原因。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-1-14 23:07:10 | 显示全部楼层
魁拔 发表于 2013-1-14 23:04
好强大的VC++6.0,我的什么都没有提示,输出竟然是正常的。

我用的是VS2008,而且并不是由编译器提示错误的,系统可能会进行一些检测的,提示是系统弹出的。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-1-14 23:18:21 | 显示全部楼层
魁拔 发表于 2013-1-14 23:06
其实我是说 a[2] 这个元素在数组中根本不存在,因为数组长度是 1,但是软件没有报错,而且正常运行,不知 ...

a[2]并不一定是表示数组中的元素啊,它表示a地址向后偏移两个单位的地址代表的内存!
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-8-9 04:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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