A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王海江1 中级黑马   /  2014-6-4 11:09  /  2220 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王海江1 于 2014-6-13 22:22 编辑

例如:
char a[]="I am happy";
等价于char a[10]="I am happy";没有错吧?

问:数组a的长度是10,还是11?

评分

参与人数 1技术分 +1 收起 理由
傘が咲く + 1

查看全部评分

7 个回复

倒序浏览
你好,我手里暂时没有编译器,但我来试着回答一下。
首先它们并不等价:
char a[] = "I am happy"是一个字符串
char a[10] = "I am happy"是一个字符数组
它们可是有千差万别的!
字符串char a[]占据11个字节的存储空间,因为除了要保存I am happy这几个字符外还要在末尾添加'\0'以示字符串结尾。字符串a[]的下标是从0~10
而字符数组char a[10] 在声明时就已经固定了它只能占用10个字节,也就是保存10个字符;
在a[10]中放入I am happy这几个字符后,包括空格在内,已经达到了字符数组a[10]的存储上限,所以不会在末尾添加'\0'标记。字符数组a[10]的下标是0~9.
如果用strlen()函数计算它们两个的长度的话,首先要说一下strlen()函数的原理,strlen()在获取字符串首字符的地址后,会一直往下走,它不管你这个数组有多长,它只认字符串结尾标记'\0'
所以如果计算字符串a[]的长度的话,就会是10;
如果计算字符数组a[10]的长度的话,由于最后一位是字符'y',所以strlen()还会继续计算下去,直到在内存中遇到'\0'标记后终止(内存中一定会遇到的),这样计算出的长度就因系统当前的状态而异了。

由于我暂时没有编译器,所以我给出的回答只是参考,你可以在你的编译器中试着运行一下,看看用strlen()
计算出的长度是怎样的,来印证我的回答。

希望我的回答对你有所帮助。

评分

参与人数 1技术分 +1 收起 理由
傘が咲く + 1

查看全部评分

回复 使用道具 举报 1 0
第一个的长度是11(包括“\0”),第二个的长度是10,并且第一个是字符串数组,第二个只能称为字符数组(因为没有\0结尾),用sizeof()函数可以测试,另外strlen函数是测不出来“\0”的。请看下面的代码及运行结果:  c=11, d=10

  1. #include <stdio.h>

  2. int main ()
  3. {
  4.     char a[]="i am happy";
  5.     char b[10]="i am happy";
  6.     int c=sizeof(a);
  7.     int d =sizeof(b);
  8.     printf("c=%d,d=%d\n",c,d);
  9.     return 0;
  10. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
傘が咲く + 1

查看全部评分

回复 使用道具 举报
显然是不相同的。。。
回复 使用道具 举报
XCodeRush 发表于 2014-6-4 11:53
你好,我手里暂时没有编译器,但我来试着回答一下。
首先它们并不等价:
char a[] = "I am happy"是一个字符 ...

正在研究。。。{:2_41:}
回复 使用道具 举报
11, 里面有十个字符 你就要开11个字符的空间   c语言里面已/0结尾 会占用一个位置 所以长度+1
回复 使用道具 举报
路过   沙发
回复 使用道具 举报
如例:
char a[]="I am happy";
等价于char a[10]="I am happy";

问:数组a的长度是10,还是11?

回答:数组a的长度是11,


char c[6]=”abcde“;                //定义一个长度为5的字符串,加上'\0' 正好是6个字符”;
      系统会自动在字符串尾部加上一个\0结束符,字符串尾部有个'\0',如果没有这个结束标记,说明这个字符数组存储的并不是字符串。
1 char a[3] = {'m', 'j', '\0'}; // 添加了结束符\0
2
3 char b[] = {'i', 's'}; // 假设忘记添加结束符\0
4
5 printf("字符串a:%s", a); // 输出字符串a
6
7 printf("\n"); // 换行
8
9 printf("字符串b:%s", b); // 输出字符串b
复制代码
看清楚了,第3行的字符数组b后面没有添加结束符\0,因此b不算是个正宗的字符串。

按照你的猜想,字符串b的输出应该就是"is",但是输出结果为:,可以看出,当我们尝试输出b的时候,把a也输出了。
printf("字符串b:%s", b); // 输出字符串b
%s表示期望输出一个字符串,因此printf函数会从b的首地址开始按顺序输出字符,一直到\0字符为止,因为\0是字符串的结束标记。

所以,如果想要创建一个字符串,记得加上结束符\0,不然后果很严重,会访问到一些垃圾数据。


字符数组
字符数组的初始化与数值型数组初始化没有本质区别。但它除了可以逐个给数组元素赋予字符外,也可以直接用字符串对其初始化。
cahr c[]={1,2,3,4,5};//数值型

char c[5]={'i','l','o','v','e'};//字符型
size=sizeof(c);
printf("%d",size);
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马