c语言字符数组初始化语法:char str[]=""与char str[]={}有何区别?

是否本质上一样?哪个更推荐使用?... 是否本质上一样?哪个更推荐使用? 展开
 我来答
jesry_wu
2016-06-24 · TA获得超过942个赞
知道小有建树答主
回答量:793
采纳率:72%
帮助的人:207万
展开全部
区别不大,看你怎么用
如果你这样写:
char str[]="abc" ;
char str[]={"abc"} ;
那就没区别

char str[]="abc" ;
char str[]={'a','b','c'} ;
那就有区别了,char str[]="abc" ;相当于char str[]={'a','b','c',0 } ;
这样就看出区别了,数组长度不一样,一个是4因为会自动添加一个结束符,一个是3不会添加结束符。
更多追问追答
追问

那如何解释下面运行结果(输出的就像有结束符似的,没乱码)?

追答
这有可能的,s是被分配在栈空间,s数组后面是个不定的值,碰巧是个0而已。但是这种正常并不是绝对的,你把这段代码放在这里是正常的,放在别处就不一定输出正常,所以不必纠结这种现象。char只是一种数据类型,'a','b','c'看起来是字符,其实也是一个个数值,这种定义和 int c[]={1,2,3} ; 相比,除了类型不同,含义是一样的,并非是字串,编译器不会自动去补结束符,只有字串才有结束符
bad5tone
2016-06-24 · TA获得超过437个赞
知道小有建树答主
回答量:215
采纳率:0%
帮助的人:150万
展开全部
前面那个是在定义的时候赋值,char数据类型只能在定义变量的时候赋值字符串。
举例1
char str[]="Hello!"; 或者char str[]={"Hello!"};这两个是一样的。
举例2
char str[]; str[]="Hello!"; 这里先定义,在赋值,这局赋值语句语法是错误的。
举例3
例2不行,那如何赋值。如下
char str[]; str[]={'H','e','l','l','o','!'}是一个一个赋值的,
也可以这样赋值str[0]='H'; str[1]='e'; .........str[5]='!';

总结:1. char数据类型只能在定义的时候赋值双引号里的内容,表示字符串
2. 字符串和字符的区别就是字符串在内存中在字符结尾多存了一个 '\0' 表示字符串结束

所以,char str[]="";是在定义的时候赋予str一个空字符串,但是内存中有存'\0',也可以写成 char str[]={""}; 赋值字符串的时候花括号可以去掉。这么一来再看你的另一个语句
char str[]={};里面没有双引号,其实就是没有常量赋值给str,这里等价于 char str[].
如果是要赋值字符串的话推荐char str[]="";很好用。但是要搞懂字符和字符串的区别
采纳可追问,天天在线。
追问

两个问题:

  1. 上面你说赋值{}是空,什么都没有,那为什么输出%s会得到三个长度的乱码,如图?


2. 直接赋值{"a"}与{'a'}的区别?

追答
刚学习c语言变量的时候有讲,定义一个变量,系统会自动给他分配一块存储空间,里面的内容是不确定的。可能是用过被释放的空间但是没清除内容。 所以一般在使用前先赋值。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
White_MouseYBZ
2016-06-24 · TA获得超过4万个赞
知道大有可为答主
回答量:2.1万
采纳率:82%
帮助的人:6570万
展开全部
char str[]="";是正确语句,它被编译器解释为char str[1]={'\0'}。
char str[]={};是错误语句,通常应该连编译都不会过。因为[]空着时,编译器要数等号右边的元素看应该在[]中填几(分配多少单元),而这里{}中什么也没有就确定不了[],会报错(声明数组时要求[]中是大于0的整数)!不过这也许与编译器有关,后来的编译器会不会认为[]中可以填0?——虽然无意义(0个元素的数组能干啥?)但语法就合法了;或者像C++处理空类一样固定分配1个字节?——我没有碰到过,只是猜测。
更多追问追答
追问
char str[]={};是错误语句,通常应该连编译都不会过。--- gcc可以编译运行的,呵呵
追答
我想你肯定能看懂“不过”后面的表述!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
My_Persistence
2016-06-24 · TA获得超过3466个赞
知道大有可为答主
回答量:1201
采纳率:81%
帮助的人:428万
展开全部
//示例程序如下
#include <stdio.h>
void main()
{
char s1[]="";
char s2[]={};
printf("s1数组的长度为: %d\n",sizeof(s1));
printf("s2数组的长度为: %d\n",sizeof(s2));
printf("%s",s1);  //该语句输出为空,因为字符串结束标志符'\0'不会显示
printf("%s",s2);  //输出为空,因为字符数组为空
}

运行结果如下:

更多追问追答
追问

麻烦解释下这个运行结果

追答
我用gcc编译的,输出字符串%s结果为空啊,你这用的是VS编译器吗
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
silenceandluo
2016-06-23 · TA获得超过1046个赞
知道小有建树答主
回答量:713
采纳率:0%
帮助的人:270万
展开全部
 不一样
char str[]=""; 给数组中存放一个空字符串char str[]={};数组中没有任何值;
数值初始化的时候最好指定数组的长度,例如:
char str[100]="";
更多追问追答
追问
能不能给出一段代码证明它确实不一样?
追答
c语言规定:数组在定义的时候必须指明数组的长度  例:char  str[100];
初始化的时候如果没有指明长度,根据初始数据的个数决定数组长度。
char str[]=""; 数组的长度是1,数组中存放的是\0
char str[]={}; 数组的长度是0,数组中什么也没有
在下面的程序中,数组存放的数据就是有限的。
main()
{ char s1[]="";
char s2[]={};
printf("%s",s1) ; //该语句输出为空,因为\0不会显示
printf("%s",s2); //输出一行乱码 因为数组中没有值
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(5)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式