社区
C语言
帖子详情
关于 char [5] 和 char [6]
wlgc123321
2010-11-25 10:46:02
char a[5] = "hello";
char a[6] = "hello";
我知道这个会少个\0
可是我试了下好像两个都可行
mingw编译 运行
有请高人!
...全文
215
16
打赏
收藏
关于 char [5] 和 char [6]
char a[5] = "hello"; char a[6] = "hello"; 我知道这个会少个\0 可是我试了下好像两个都可行 mingw编译 运行 有请高人!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
16 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
ZXW0521
2010-11-25
打赏
举报
回复
char a[5] = "hello";
然后a+5的地址刚好是0,
这次就输出对了,
如果某次运行,这个地址不为0,那就会打印出一些乱码
dingshaofengbinbin
2010-11-25
打赏
举报
回复
有意义吗??
hai040
2010-11-25
打赏
举报
回复
char a[5] = "hello";
不是说不放'\0'
而是把0放到申请的空间后面,写了其它人的数据
这里没出错可能是因为内存对齐
换4或8长度的字符串试试
wanghang8888
2010-11-25
打赏
举报
回复
你定义一个char a[5]={'a','b','c','d','e'};再输出cout<<a;就出错了,因为没有‘\0’.
zoudaokou2006
2010-11-25
打赏
举报
回复
MINGW我不知道。
但VS我跟踪过内存。
一般编译器都会做一些保护字节(另一个重要的原因是变量对其到特定值倍数字节,可以提高程序效率)
比如这里的char a[5] = "hello";
虽然你申请了只有5个字节,但是编译器可能会多出了几个字节给你做保护,如果这几个字节恰好又被初始化为0x00的话,好叻,你中彩票了。
虽然中彩票的几率蛮高,还是不要做这种操作,第一,本身就是错误;第二,即使侥幸不出事,你的代码依赖于编译器的特定行为,代码也丧失了可移植性;第三,这种代码,你让其他维护人员情何以堪啊,呵呵~~
zhutianjin4355255
2010-11-25
打赏
举报
回复
数组越界编译器不会报错,万一越界的内存存放着关键值,将会给楼主带来不可预料的后果
至善者善之敌
2010-11-25
打赏
举报
回复
你记住遇到CHAR 类型的多申请一个给\0就可以了
aining0809
2010-11-25
打赏
举报
回复
[Quote=引用 1 楼 yyg990441 的回复:]
某次运行正确,或者在某个特殊的编译器上运行正确不代表这个程序就正确.
就好象某次我买彩票中了100万,不代表我每次买都会中100万.
[/Quote]
同意!!
编译器的问题。
VC6.0会报错(error C2117: 'hello' : array bounds overflow)
GCC不会报错,但结果肯定不是你预期的。
wlgc123321
2010-11-25
打赏
举报
回复
嗯,谢谢以上各位回答
嗯 遵守规则
我只是好奇 一时找不到出错的例子
书上说会一直读取直到遇到\0为止 可是我这样写
char a[5] ="hello";
int age = 18;
char name[9]="zhangsan";
printf("%s\n",a);
也只打印hello 没有一直读到zhangsan
luciferisnotsatan
2010-11-25
打赏
举报
回复
是都可以编译运行。但第一个会溢出
debug模式下,变量之间会有些数据填充,可能发现不了错误。release模式下,就有可以出错。
Jesusgospelnj
2010-11-25
打赏
举报
回复
同意,内存在那,关键是你是否去访问,
無_1024
2010-11-25
打赏
举报
回复
最好遵守规则 都有'\0'但是第一个有内存溢出
yyg990441
2010-11-25
打赏
举报
回复
某次运行正确,或者在某个特殊的编译器上运行正确不代表这个程序就正确.
就好象某次我买彩票中了100万,不代表我每次买都会中100万.
wlgc123321
2010-11-25
打赏
举报
回复
[Quote=引用 12 楼 hai040 的回复:]
char a[5] = "hello";
不是说不放'\0'
而是把0放到申请的空间后面,写了其它人的数据
这里没出错可能是因为内存对齐
换4或8长度的字符串试试
[/Quote]
嗯 谢谢 我换成4 终于找到出错的例子了!!
赵4老师
2010-11-25
打赏
举报
回复
试试这个看输出什么:
char a[8] = "12345678";
char b[6] = "hello";
printf("%s,%s\n",a,b);
MySQL 数据类型和运算符
Re: MySQL 数据类型和运算符=============================# 数据类型 整数类型:五种 TINY SMALL MEDIUM INT BIG 浮点和定点小数类型:三种 FLOAT DOUBLE DECIMAL 日期与时间数据类型:五种 YEAR -1 字符串类型:二种
CHAR
(M) VAR
CHAR
(M) -1 二进制字符串:位字段BIT 固定BINARY 可变VARBINARY -1 # 运算符 算术 运算符 比较 运算符 逻辑 运算符 位操作 运算符 运算符的优先级-------------------------------------
c语言中
char
* 和 unsigned
char
* 的区别浅析
背景最近在项目中遇到了一个编译警告,是因为定义的变量为
char
[],而在使用时作为函数的unsigned
char
*类型的参数调用。这个警告很容易避免,但是
char
*和unsigned
char
*到底有什么区别呢,本文作一个简单的探讨。
char
和 unsigned
char
的区别在C中,默认的基础数据类型均为signed,如定义变量为int,long等,都为有符号的。如果要定义无符号类型,必须显
C语言
char
,
char
*赋值
1.单字符
char
a=’1’; 2.多字符
char
a[5]=”1133”; 3.字符数不确定
char
a[]=”1132131233”; 4.
char
* str = new
char
[10];str = “2131”; 5.
char
* str = “12312”; 6.
char
* str = new
char
[10];strcpy(str,”1233”);注qt中上两种
char
*报错...
char
和 unsigned
char
的区别
1、
char
取值范围是 -128~+127。 2、我们先来看 signed
char
的最大值。 最高位是 符号位, 0 代表正数; 1 代表负数。0 1 1 1 1 1 1 1 这个值等于 2^0 + 2^1 + 2^2 + 2^3 + 2^4 + 2^5 + 2^6 = 127 。 也有一个简便计算方法:2^7 -1 = 128-1 =127 所以,signed...
char
和unsigned
char
,
char
* 和unsigned
char
*的区别
在C语言中,默认的基础数据类型均为signed,如定义变量为int,long等,都为有符号的。如果要定义无符号类型,必须显式地在变量类型前加unsigned
char
和 unsigned
char
区别 相同点:在内存中都是一个字节,8位(2^8=256),都能表示256个数字 不同点:
char
的最高位为符号位,因此
char
能表示的数据范围是-128~127,unsigned
char
没有符号位,因此能表示的数据范围是0~255 实际使用中,如普通的赋值,读写文件和网络字节流都没有区别,不管最高位是
C语言
69,382
社区成员
243,073
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章