社区
C语言
帖子详情
关于 char [5] 和 char [6]
wlgc123321
2010-11-25 10:46:02
char a[5] = "hello";
char a[6] = "hello";
我知道这个会少个\0
可是我试了下好像两个都可行
mingw编译 运行
有请高人!
...全文
266
16
打赏
收藏
关于 char [5] 和 char [6]
char a[5] = "hello"; char a[6] = "hello"; 我知道这个会少个\0 可是我试了下好像两个都可行 mingw编译 运行 有请高人!
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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);
【C/C++】对
char
* 和
char
[]区别的一些理解
相同点首先 这两种类型都可以对应一个字符串,比如:
char
* a=”string1”;
char
b[]=”string2”; printf(“a=%s, b=%s”, a, b); 其中a是一个指向
char
变量的指针,b则是一个
char
数组(字符数组),其次 ,很多时候二者可以混用,像函数传参数的时候,实参可以是
char
*,形参可以是
char
[],比如: void fun1(cha
char
[]、
char
*和string之间的比较和转换
char
[]、
char
*和string之间的比较和转换 在C++编程中,很多时候我们会遇到如何对
char
[]和
char
*进行比较,当然一般来说都是通过使用strcmp方法,当然看了C++ primer的话都知道不能使用“== ”,那么先看看直接使用“==”是什么样的结果。 本文章参考文章链接如下: 参考链接 我们先来看看下面的程序: #include <iostream> using namespace std; int main() {
char
arrTest1[] = "abc
char
和u
char
区别
char
和u
char
区别
char
是有符号的, u
char
(unsigned
char
)是无符号的! 1、作为字符来表示的话,两者没有什么区别! 2、作为整数来表示的话,由于
char
是有符号的,于是数值范围为-12...
unsigned
char
与
char
char
和 unsigned
char
是无符号的 两者都作为字符用的话是没有区别的,但当整数用时有区别:
char
整数范围为-128到127( 0x80~0x7F), 而unsigned
char
整数范围为0到255( 0~0xFF ) 多数情况下,
char
,signed
char
、unsigned
char
类型的数据具有相同的特性然而当你把一个单字节的数赋给一个大整
const
char
* 、
char
const *、
char
* const 三者的区别
C/C++ 中关于以下三种定义: const
char
*ptr;
char
const *ptr;
char
* const ptr; 现整理三者之间的区别与联系。 一、const
char
*ptr; 定义一个指向字符常量的指针,这里,ptr是一个指向
char
* 类型的常量,所以不能用ptr来修改所指向的内容,换句话说,*ptr的值为const,不能修改。但是ptr的声明并不意味着它指向的值实际上就是一个常量,而只是意味着对ptr而言,这个值是常量。实验如下:ptr指向str,而str不是
C语言
70,026
社区成员
243,262
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章