黑马程序员技术交流社区

标题: 字符串求帮忙 [打印本页]

作者: LuciferTJD    时间: 2015-4-5 10:24
标题: 字符串求帮忙
本帖最后由 汤靖咚 于 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, 下载次数: 166)

字符串输出.png

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

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

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

o k后面会有一个/0的
作者: David88    时间: 2015-4-5 14:51
把name 数组定义在name2之后就得到你想要的结果了
作者: 13673696542    时间: 2015-4-5 17:38
汤靖咚 发表于 2015-4-5 13:37
name2没有结束符,会接着向下继续输出吧

两个变量在分配内存的时候并不一定是连续的,有时会连续是种巧合,系统运行后由于内存频繁的分配和回收会有内存碎片存在,如果有个变量的大小正好能放到碎片中那另一个变量就和前一个变量分开啦。
作者: tangwanchao    时间: 2015-4-5 18:26
同问,刚才调试了一下,如果把\0去掉,输出的就是okitcast,为什么加上\0就是输出ok了呢?
作者: LuciferTJD    时间: 2015-4-5 19:52
waterfoxjie 发表于 2015-4-5 14:10
o k后面会有一个/0的

像这样定义的时候name2[]中是没有'\0'的
作者: LuciferTJD    时间: 2015-4-5 19:54
David88 发表于 2015-4-5 14:51
把name 数组定义在name2之后就得到你想要的结果了

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

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

作者: 游戏龙    时间: 2015-4-5 20:48
同学习了
作者: LuciferTJD    时间: 2015-4-6 07:51
游戏龙 发表于 2015-4-5 20:48
同学习了

:handshake




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2