C语言数组:不是说char[]="hello"共6位最后一位为\0,char[4]="hell";那么最后一个一位/0去哪里?

供稿:hz-xin.com     日期:2025-01-12
关于C语言字符数组的赋值最后自动添加‘\0’问题

#includevoid main(){char c[6]={"hello"};printf("%s
",c);c[0]='A'; // 仅对第一位元素赋值,它并不影响其后面的字符 printf("%s
",c);c[1]='B'; // 同理 printf("%s
",c);}

当然不一样。char*a是一个指向字符对象的指针,该对象可以是一个字符,也可以是字符串(即字符数组);而char a[]则是定义了一个元素个数不定的字符数组;具体来说,初始化时都可以说:
char*a="asdasd";
char a[]=asdasd";
但是定义之后,*a可以将字符串整体赋给他,而char[]则不行,如*a="asdasww";是对的,
但a[]="asdasww";绝对是不允许的!

上面的回答已经说明了本质,这是一个数组越界,是错误的代码编写方式,千万不要这么写。
什么是数组越界,就是char[4]明确只能存4个字符,但是char[4]="hell"却给他赋值了5个字符:'h'、'e'、'l'、'l'、'o'、'\0'。
上面的这个'\0'虽然你手动并没有写,但实际上编译器会给你加,是隐性的。
所以char[]="hello"的strlen和sizeof不同,前者是5后者是6就因为多了一个'\0'。而且为什么char[]="hello"没有越界,因为char[]并没有指定数组长度,他是变长的。
最后补充一点char[4]="hell"是数组越界,是一个错误的字符串使用方式,一些编译器在编译时严格上会报告警或错误。但如果char[4]不作为字符串使用而作为字符数组来存单个字符的话可以这个用:char[4]={'h', 'e', 'l', 'l'},这样编译应该不会错,但也只能作为字符数组用不能作为字符串使用,比如printf("%s"),这种就不行,即使能输出也是碰运气,因为%s的时候是遇到\0截至,而你不知道后面的内存是不是干净的,除非你改成char[5]={'h', 'e', 'l', 'l', '\0'},这种估计可以当字符串使用,但基本不会有人这么用。

char c[4]="hell";这种情况属于数组越界,是逻辑错误。并且这个字符\0仍然有,只不过非法修改了内存中的其它内容。

char a[4]="hell"这种本来就有问题 a只有4字节空间 却写了5个字节进去 内存越界了

char是关键字。用户标识一般用来给变量数组函数等命名。用户标识符与关键字相同,编译时系统给出错误信息

char *a[]="abcd";为什么是错了?
(*(a+1)) 则表示a这个数组的第二个元素的内容(char指针)所指向的内容(w字符).char * a[10] 表示限定这个数组最多可存放10个元素(char指针), 也就是说这个数组占用10*8 = 80字节.楼主你要定义的是数组,所以你要了解一下数组的赋值方式,char *a[]={"ddasd"};而不是char *a[]="abcd...

C语言中 用scanf函数输入字符串数组,取地址符&是不用输的,如果输了取...
c就代表c[0]的地址。设数组c的首地址为0X2000,也就是说c[0]地址为0X2000,则数组名c就代表这个首地址。因为c已经表示地址,所以在c前面不能再加取地址符&。字符串数据类型是建模在形式字符串的想法上的数据类型。字符串是几乎在所有编程语言中可以实现的非常重要和有用的数据类型。

c语言中char类型数组的输出问题--输出时为何需要&符?
在C语言中数组的名字即数组的起始地址,也是数组第一个元素的地址。因此,假设有一个char类型的数组a表示成如下代码:char a[20];那么a表示字符数组的起始地址,它和&a[0]是一个意思。使用printf()输出字符数组a的内容:printf("%s\\n", a);它就等同于printf("%s\\n", &a[0]); 本回答由电脑网络分类达人 ...

c语言中给数组赋值能用&符号吗?
上面的程序是给你数组中的元素赋值,你注意看一下输入,输入这一块要用取地址符的,而输出不用!当你给数组中输入字符串时不用取地址符:代码:scanf("%s"arr);当你给数组中输入字符是=时,要用取地址符:代码:char arr[10]={0};for(i=0;i<10;i++) { scanf("%c",&arr[i]);} ...

c语言中 关于字符数组 char[ ]={1,2,3,4}; 此语句是否是正确的数组说...
虽然char c[]={1,2,3,4}; 没有说明方面的错误,也能正常编译,这是由于C\/C++中字符型变量与整形变量是可以通用的。但达不到你说的“不用加引号了”的效果。char c[]只是说明c是字符型数组变量,说明白点就是单字节数组;至于你在说明时赋什么值那就要看等号右边的大括号里怎么写。你这种写法...

一个选择题 大家帮帮忙吧 谢谢
搞错了没?这基础都这么好…… 选择C。c语言里数组是不可以用“=”整体付值的。字符串是一串连续的内存,在很多性子和数组都很像,但字符串有他的特别的地方,那就是可以使用字符串函数。b选项可以用gets和puts解释。d选项:字符在内存里里是ascll码存储的,因此可以比的。至于细节还有点说头,...

c语言 char *str 与char str[] 这俩种定义字符串到底有什么区别_百度知 ...
一、概念不同 char *str 声明的是一个指针,这个指针可以指向任何字符串常量。char str[] 声明的是一个字符数组,数组的内容可以是任何内容,严格意义上说,末尾加上'\\0' 之后才能算是字符串,二、变量不同 char *str里的str是指针变量,str的值未初始化(局部变量的话。全局则自动初始化为NULL)...

数组定义: char array[]=" china";
有数组定义:char array[]="china";则数组array所占的空间为6。分析过程:"china"是个字符串常量 字符串是以\\0为结束符的字符数组,\\0是个不可视字符,故"china"所占的空间为:5+1=6。char array[]="china"; 这里定义数组array,并用"china"进行初始化。定义数组时,没有指定数组元素个数,则...

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

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