黑马程序员技术交流社区

标题: 求大神给我解释一下这个问题, [打印本页]

作者: huanglinwang    时间: 2016-5-16 22:56
标题: 求大神给我解释一下这个问题,
//
//  main.c
//  %s输出字符串数组
//
//  Created by huanglinwang on 16/5/13.
//  Copyright © 2016年 Linwang. All rights reserved.
//

#include <stdio.h>

int main(int argc, const char * argv[]) {
    char ch[2] = {'a','\0'};
    char ch2[3] = { 'c','d','e'};
    printf("%s\n",ch2);
    //这里输出的是cdea 是因为???求解
    return 0;
}

作者: 栗海云    时间: 2016-5-16 23:19
因为cde没有\0 而高位的ch字符数组有\0 打印遇到\0结束
作者: TGII    时间: 2016-5-17 00:31
%s遇到\0才结束,
作者: 上帝的天使    时间: 2016-5-17 10:19
因为字符数组{'a'.'\0'}和{'c','d,'e'}存放在栈区(栈区主要存放临时变量),而栈区内数据是按照从高到低存放的。
作者: 上帝的天使    时间: 2016-5-17 10:26
因为字符数组{'a','\0'}和{ 'c','d','e'}是存放在栈区的,栈区数据是从高到低存放的,因此先声明到ch数组存放在高字节,而后声明动ch2存放在低字节。对于字符数组来说打印时遇到'\0'结束。而打印是按照从低地址—>高地址的顺序打印的,因此当打印完ch2时,检测到没有换行符,所以会继续打印高地址的ch字符数组{'a','\0'},所以打印的结果就是:"cdea"了。
作者: 上帝的天使    时间: 2016-5-17 10:28
1.字符数组{'a','\0'}和{ 'c','d','e'}是存放在栈区的。
2.栈区数据是从高地址到低地址存放的,因此先声明的ch数组存放在高字节,而后声明动ch2存放在低字节。
3.对于字符数组来说打印时遇到'\0'结束。而打印是按照从低地址—>高地址的顺序打印的。
4.因此先从低地址低ch2字符数组开始打印,当打印完ch2时,检测到没有换行符,所以会继续打印高地址的ch字符数组{'a','\0'},所以最后打印出来的结果就是:"cdea"了。




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