2 yzy4829229 yzy4829229 于 2015.07.08 14:58 提问

关于一个字符数组的问题

假如我定义了一个char name[40],跟据书中的描述,一个字符串是以'\0'结尾,
我的问题是,这个\0也要占一个字节,那么这个\0是在40数组中的最后一个呢?也就是
说实际上程序只允许我有39个字符,还是放在我定义的字符数组以外呢?

7个回答

iamkingplayer
iamkingplayer   2015.07.08 15:10

char name[40]是一个字符数组,并不是字符串,你可以写一个小程序测一下就明白了

yzy4829229
yzy4829229 太好了,虽然没有告诉我答案,但是给了我渔具,哈哈!已经解决,谢谢!
2 年多之前 回复
caozhy
caozhy   Ds   Rxr 2015.07.08 15:08

你说的很对,只能保存39个。

caozhy
caozhy 回复易天曦: 会放在数组之后的那个内存空间中。表面上似乎可以。但是因为那个地方其实没有被算作这个数组的存储空间。C++可以分配给另一个变量。那么结果就是可能会破坏那个变量。这种错误很隐蔽。
2 年多之前 回复
caozhy
caozhy 回复易天曦: 会放在数组之后的那个内存空间中。表面上似乎可以。但是因为那个地方其实没有被算作这个数组的存储空间。C++可以分配给另一个变量。那么结果就是可能会破坏那个变量。这种错误很隐蔽。
2 年多之前 回复
yzy4829229
yzy4829229 那为什么我定义一个name[4],然后我输入lile,也能放得下,并且输出了,那\0放哪里了?
2 年多之前 回复
caozhy
caozhy 回复易天曦: 但是C++不会进行下标越界检查,换一句话说,你甚至写name[100]='a'也可能不会报错。但是这会导致不可预测的后果。
2 年多之前 回复
caozhy
caozhy 回复易天曦: 如果你的数组只有40个元素,只能保存39个字符,因为'\0'也会占用1个
2 年多之前 回复
yzy4829229
yzy4829229 你为什么要骗我。。。。
2 年多之前 回复
abcd880129
abcd880129   2015.07.08 15:13

难道你的字符串中会有'\0'字符。你是不是要把字符串变成字符数组,或者字符数组变成字符串。具体应用场景说一下

caozhy
caozhy 再比如,幼儿园老师告诉你,闯红灯会被车撞到。但是不是说每次撞红灯都会被撞。更可怕的是,你没有被撞反倒理直气壮地认为,闯红灯很安全是“经过验证”的。
2 年多之前 回复
caozhy
caozhy 回复易天曦: 写程序最怕的就是基本知识不掌握,仅仅满足于程序能够运行。
2 年多之前 回复
caozhy
caozhy 回复易天曦: 写程序最怕的就是基本知识不掌握,仅仅满足于程序能够运行。
2 年多之前 回复
caozhy
caozhy 回复易天曦: 你要从原理上学习,而不是“实践”。好比科学告诉你人体接触36V以上的电压就会触电。但是不是说你“验证”了下你触摸了100V的没有电死就是这个理论错了。这只是一种可能性。
2 年多之前 回复
yzy4829229
yzy4829229 我正在学习字符数组,当定义一个字符数组之后,如果存储一个字符串的话,长度必须是n-1个吗?最后一位存储的是'\0'是吗?但是我用计算机验证的时候,我定义了一个name[4],并且我放入了4个字符,居然没有出错,然后我用i=0验证,发现当name[i]是'\0'的时候,i是4,也就是说是第五个字符,这是怎么回事呢?
2 年多之前 回复
oyljerry
oyljerry   Ds   Rxr 2015.07.08 15:54

添加\0作为字符串数组结尾是标准做法,这样当你进行字符串拷贝,strcpy,strlen等系列函数时,它就会以这个作为结尾来知道字符串应该操作多长的长度

如果你不加\0,就会容易发生一些缓冲区溢出,这个也是早期攻击最容易出现的代码位置。

所以对于你的char name[40],数组,你就知道实际能够存入的有效字符是39个

caozhy
caozhy   Ds   Rxr 2015.07.08 15:58
dfj12345
dfj12345   2015.07.08 15:59

兄弟,字符串是要以'\0'为结尾了,而你声明的是一个字符数组,正如你所说你定义了name[4]你是可以获取存4个字符进行
,但是你第五个字符就不可控了(就是踩内存/内存越界),虽然你测试时name[4] = '\0'刚好,但是如果不是的话那你定位
问题是很难的。为了保证最后一个是'\0'结尾(因为你开始时已经初始化为0了),所以存储最大的是n-1

zuishikonghuan
zuishikonghuan   2015.07.08 19:12

是在这40个的最后一个,它起到一个声明字符串结束的作用,当然,如果你用strcpy复制一个10字节的字符串时,那么name[9]就是\0,后面那些一般也是\0,但不排除有可能不是

Csdn user default icon
上传中...
上传图片
插入图片