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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© LuciferTJD 中级黑马   /  2015-4-5 10:24  /  1615 人查看  /  14 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 汤靖咚 于 2015-4-7 10:17 编辑

一个简单的代码,字符串输出
  1. #include <stdio.h>

  2. int main()
  3. {
  4.     char name[] = "itc\0ast";
  5.    
  6.     char name2[] = {'o','k'};
  7.    
  8.     //int ages[] = {12,32,43,14};
  9.    
  10.     printf("%s\n",name2);
  11.    
  12.     //printf("%s\n",&name2[1]);
  13.    
  14.     //printf("%d\n",ages[2]);
  15.    
  16.     return 0;
复制代码

理论上应该是输出:okitc,实际为什么输出的是:ok
难道和xcode版本有关系,6.2版本的。求大神给解释一下,谢谢!

字符串输出.png (17.19 KB, 下载次数: 170)

字符串输出.png

14 个回复

倒序浏览
{:3_66:}{:3_66:}{:3_66:}
回复 使用道具 举报
你这里本身就定义两个数组啊,第一个虽然你没有写\0,但是它默认保存的也是字符串的,也是会添加\0在尾部的,所以输出的时候就只有ok了    你也那个name2里面的元素加多一个数字进去,输出的就是ok加数字了
回复 使用道具 举报
你那里觉得它应该输出:okitc,你就用到了name2没用到其他变量呀?
回复 使用道具 举报
waterfoxjie 发表于 2015-4-5 12:47
你这里本身就定义两个数组啊,第一个虽然你没有写\0,但是它默认保存的也是字符串的,也是会添加\0在尾部的 ...

是先定义的name[],并且在中间加了'\0',后定义的name2[]中没有'\0',两个字符串在内存中从大到小存储。在输出时从name2的首字节开始输出,'o' 'k'后并没有字符串结束符,会接着向下输出,'i' 't' 'c' 然后遇到'\0',输出终止,最后不就应该是okitc吗
回复 使用道具 举报
13673696542 发表于 2015-4-5 12:51
你那里觉得它应该输出:okitc,你就用到了name2没用到其他变量呀?

name2没有结束符,会接着向下继续输出吧
回复 使用道具 举报
汤靖咚 发表于 2015-4-5 13:36
是先定义的name[],并且在中间加了'\0',后定义的name2[]中没有'\0',两个字符串在内存中从大到小存储。 ...

o k后面会有一个/0的
回复 使用道具 举报
David88 来自手机 中级黑马 2015-4-5 14:51:49
8#
把name 数组定义在name2之后就得到你想要的结果了
回复 使用道具 举报
汤靖咚 发表于 2015-4-5 13:37
name2没有结束符,会接着向下继续输出吧

两个变量在分配内存的时候并不一定是连续的,有时会连续是种巧合,系统运行后由于内存频繁的分配和回收会有内存碎片存在,如果有个变量的大小正好能放到碎片中那另一个变量就和前一个变量分开啦。

评分

参与人数 2技术分 +1 黑马币 +4 收起 理由
Micro + 1 很给力!
LuciferTJD + 4 我也没有多少,不过还是要谢谢你~.

查看全部评分

回复 使用道具 举报
同问,刚才调试了一下,如果把\0去掉,输出的就是okitcast,为什么加上\0就是输出ok了呢?
回复 使用道具 举报
waterfoxjie 发表于 2015-4-5 14:10
o k后面会有一个/0的

像这样定义的时候name2[]中是没有'\0'的
回复 使用道具 举报
David88 发表于 2015-4-5 14:51
把name 数组定义在name2之后就得到你想要的结果了

反过来就更不会了,name在name2的低位,输出时就不会读取name了
回复 使用道具 举报
13673696542 发表于 2015-4-5 17:38
两个变量在分配内存的时候并不一定是连续的,有时会连续是种巧合,系统运行后由于内存频繁的分配和回收会 ...

恩,应该是的,刚刚测试了一下,发现name[]中加'\0'和不加时,内存地址是不同的,一个相连接一个不连接,所以才会输出不同,谢啦:lol:lol:lol
这个是不加'\0'的
name[]地址为0x7fff50ca5c35
name2[]地址为0x7fff50ca5c33
okitcast
这个是加'\0'的
name[]地址为0x7fff53aa2c30
name2[]地址为0x7fff53aa2c2a
ok
回复 使用道具 举报
同学习了
回复 使用道具 举报

:handshake
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马