c语言问题: 为什么char str[6]="string",就数组级越界了呢?不是说'\0'不占内存的吗?

用sizeof(str)
我发现下面两种定义得到的结果是不同的;
第一种:
char str[6];
str[0]='s'; str[1]='t'; str[2]='r';
str[3]='i'; str[4]='n'; str[5]='g';
得到的结果是6;
第二种:
char str[]="string";得到的结果是7;这个是为什么啊

第一个是字符数组。相当于char str[6]={ 's','t','r','i','n','g'}; 得到的结果是6

在C语言中没有专门的字符串变量, 通常用一个字符数组来存放一个字符串。 前面介绍
字符串常量时, 已说明字符串总是以'\0'作为串的结束符。 因此当把一个字符串存入一个数
组时,也把结束符'\0'存入数组,并以此作为该字符串是否结束的标志。有了'\0'标志后,
就不必再用字符数组的长度来判断字符串的长度了。
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-09-11
第一个是字符数组 第二个是字符串 当第一个不赋值的时候 输出也是6 因为你数组就六个空间 但是第二个str已经是指针了,字符串指针,sizeof的判断条件是‘\0’,并且把‘\0’也算作个数了 说了这么多 给你最佳吧
第2个回答  2012-09-11
字符数组并不要求它的最后一个字符为‘\0’,甚至可以不包含'\0',是否需要加'\0',完全根据需要决定。
char c[5]={'C','h','i','n','a'};完全合法
如果有char c[10] ="China";则第六个元素为'\0',后4个元素也设定为空字符,
第二种,系统对字符串常量自动加一个'\0' ,在输出字符数组中的字符串时,遇‘\0’就停止输出
比如定义
char c[10] ={'C','h','\0','n','a'};
结果只输出Ch
第3个回答  2012-09-11
因为第二种在最后自动附上‘\0’结束
第4个回答  2012-09-11
“string”在内存中是 's' 't' 'r' 'i' 'n' 'g' '\0',七个字节。

...string",就数组级越界了呢?不是说'\\0'不占内存的吗?
第一个是字符数组。相当于char str[6]={ 's','t','r','i','n','g'}; 得到的结果是6 在C语言中没有专门的字符串变量, 通常用一个字符数组来存放一个字符串。 前面介绍 字符串常量时, 已说明字符串总是以'\\0'作为串的结束符。 因此当把一个字符串存入一个数 组时,也把结束...

c语言 scanf 出现Abort trap:6,数组定义为10,也确实输入了10个,为什么...
是字符串的问题,字符串需要一个位置用于保存结束符号'\/0',每个字符串都会自动生成这个,表示该字符串已经结束

C语言中 char str[6]={'a','b','\\0','d','e','f'}; 则语句 printf("%s...
char str[6]={'a','b','\\0','d','e','f'};\/\/这个数组中,第三个字符就是字符串结束符\\0遇到\\0结束之后,返回的长度就是2了。

C语言字符数组越界输出
所以当你输入12个'w'时,strlen(a)会等于12,sizeof(a)同样也是12,所以会得到12个w..这其实是非法的,虽然能够通过编译,但可以说这是个很危险bug..而且b数组也存在危险,因为它并没有以'\\0'结束,所以,你用strlen(b),测试它时,结果是不确定的,取决于它在b[9]后面的那个字节上找到'\\0'字符.....

求解一个c语言选择题 不是说strlen遇到\/0就停止了吗?
C语言中的字符串实际上是字符数组,即char类型的数组。不过特殊约定以\\0作为结束符。strlen是C语言中字符串函数之一,功能为求字符串的长度。即字符串中有效字符的个数,不包括结尾的\\0.要调用strlen,需要引用头文件string.h。比如 strlen("1234");的返回值为4,在内存中实际存的值为'1','2','...

c语言 编程时一个数组元素自己变了..怎么回事?
数组下标越界了,数组下标是从0开始,你定义的是10个元素的数组,故下标是从0到9,而不是1到10,下标为10的元素所占内存空间的不是数组的内存空间,故编译器还会降下标为10的元素所占空间分配给其他变量,故下标为10的元素的值会随前面或后面声明变量改变而变(至于是前面还是后面要看编译器,不同...

C语言中,为什么有的字符数组要后面要加\\0,有的不要加?
这个程序此处不加也没有问题的。因为接下来是先gets(str);然后再使用的。在函数内部定义的变量或数组,都是要先经过赋值后才能运用的,否则其中的值不确定。如果在程序代码中先经过赋值后再应用,那么在声明变量时可以不赋初值的。

c语言,字符数组中最后一个字必须为‘\\0’,为什么错?
不是字符数组中最后一个字符必须为'\\0',如果字符数组中存放的是一个字符串,则最后一个字符应当'\\0','\\0'是结束符号,这样当输出这个字符串时,只须输入数组名就可以,输出函数会自动输出数组中的字符,直到遇到'\\0'为止,否则你就要利用循环自己将字符一个一个的输出,而且还要判断该字符是不是所需要的字符,明白...

c语言字符串结尾的问题?
!的意思是非,亦可以理解成不。‘\\0’是字符串的结束符号,由编译器自动加上。比如说,把一个字符串赋值给数组:u8 str1[]={"cxjr.21ic.org"};实际上数组str1在内存中的实际存放情况为: c x j r . 2 1 i c . o r g '\\0' 这后面的'\\0'是由C编译系统自动加上的。所以在用字符...

C语言字符串常量,字符数组占内存大小问题?
用函数求的长度其实就是字符串长度,而非占内存大小。因此长度是4,占内存是5,最后有个'\\0'做结束符,不是'\\n'。字符数组如果是字符串就是这规则,否则不是

相似回答