user-0 提问: char buf_cns[] = "早上好";

回复:
user: user-1
content: 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）

user: user-2
content: 引用 14 楼 dbzhang800 的回复:[quote=引用 11 楼 r_Jimy 的回复:] 在编译的时候，char buf_cns[] = "早上好" 其实是被解释为char buf_cns[] = "XX XX XX XX"; 这些打X的东东就二进制字节，是在编译前决定好了的  这个理解真的不对。可以看看我前面给出的blog [/quote]  感谢指出，你的BLOG写得很好，顶下 执行字符集的提出，增加了问题的复杂性，UTF-8方案很好

user: user-3
content: 引用 2 楼 oldmtn 的回复:[quote=引用 1 楼 truelance 的回复:] 定义了一个数组，大小是"早上好"这个字符串的长度(包含结尾的\0), 然后对这个数组初始化，把字符串的内容填进去。 如果是全局变量，那么是编译器做的这些工作。 如果是局部变量，那么是在运行期执行执行操作。  但为什么当我页面编码为unicode和Ascii的时候出现不同的结果呢？[/quote]因为这时候 "早上好" 是不同的字符串 所以结果不一样

user: user-4
content: 书名：<Windows程序设计> 第2章Unicode简介

user: user-5
content: 引用 11 楼 r_Jimy 的回复:在编译的时候，char buf_cns[] = "早上好" 其实是被解释为char buf_cns[] = "XX XX XX XX"; 这些打X的东东就二进制字节，是在编译前决定好了的  这个理解真的不对。可以看看我前面给出的blog

user: user-5
content: 我写过一篇blog，专门介绍这个问题。  http://blog.csdn.net/dbzhang800/article/details/7540905  注意：里面提到的是C++，不过对C完全适用。

user: user-6
content: 引用 7 楼 edward_bian 的回复:从C规范讲，这样的写法是undefined的 如果不谈中文符号，这句话定义了一个字符串数组，并且在常量区有一个“早上好”的拷贝 这个写法应该是没有问题的吧。

user: user-7
content: 看一下内存是什么不就知道了么。

user: user-2
content: 手上没有VS2010的环境，用DEV C++测试了下，          对于char buf_cns[] = "早上好"，系统在编译时，不论定义成全局变量，静态变量还是局部变量，“早上好”这几个初始化用的 数据都放在目标同一段位置，也就是说，如果按这种方式分别初始化全局变量，静态变量，局部变量，这些用于初始化的数据的 物理地址是在连续的区域的（实际可能会有一点点间隔）          当然程序执行时，全局变量和静态变量是常驻在内存全局数据区的，局部变量在函数被调用时加载到内存分配给该函数的栈 空间的。全局变量和静态变量是在程序开始执行时，就随程序从物理地址一并加载到内存，局部变量是其所在函数运行时才加 载，运行完了这块空间也就释放了，但正常情况不影响这些参数所在物理空间，除非代码非法修改物理空间的这些初始化数据的 区域。                有趣的是，如果初始化时，指定大小，比如如下初始化：        char buff[200] = {0xa 0xb};        这时，如果buff是全局或静态，它的物理存放位置不变，你会发现整个目标文件随着buff的增大而增大，但如果定义成局部 变量，这时，buff的位置就跑到代码那一块去了，此时，再加大buff，对整个目标文件的影响不大，只有加大初始化的内容，目 标文件才会加大。

user: user-2
content: 引用 10 楼 zhao4zhong1 的回复:对电脑而言没有乱码，只有二进制字节；对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A 顶！ 源文件写好后，假设使用的是编译器未知编码的A编码写的，编译是绝对通不过的 假设使用的是编译器认可的编译一，在编译的时候，char buf_cns[] = "早上好" 其实是被解释为char buf_cns[] = "XX XX XX XX"; 这些打X的东东就二进制字节，是在编译前决定好了的

user: user-8
content: 对电脑而言没有乱码，只有二进制字节；对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A

user: user-9
content: 从C规范讲，这样的写法是undefined的 如果不谈中文符号，这句话定义了一个字符串数组，并且在常量区有一个“早上好”的拷贝

user: user-8
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）

user: user-10
content: 引用 4 楼 oldmtn 的回复:[quote=引用 3 楼 FightForProgrammer 的回复:] 这个是字符编码的问题，不同字符集表示当然不一样 就是这个问题啊  加入当前VS2010使用UNICODE，或者GB183030,或者JIS50220的情况下。 会出现什么结果呢？[/quote] 看编译实现了。 有两种可以能： 1 "早上好"的编码和源码的编码一致， 那么编码不同时， "早上好"的值和长度可能不同。  2. 编译器可能将源码中"早上好"转码为一个内部编码（比如ansi). 这种情况， "早上好"的值和长度都一样。  自己试试就知道了。

user: user-0
content: 引用 3 楼 FightForProgrammer 的回复:这个是字符编码的问题，不同字符集表示当然不一样 就是这个问题啊  加入当前VS2010使用UNICODE，或者GB183030,或者JIS50220的情况下。 会出现什么结果呢？

user: user-11
content: 这个是字符编码的问题，不同字符集表示当然不一样

user: user-0
content: 引用 1 楼 truelance 的回复:定义了一个数组，大小是"早上好"这个字符串的长度(包含结尾的\0), 然后对这个数组初始化，把字符串的内容填进去。 如果是全局变量，那么是编译器做的这些工作。 如果是局部变量，那么是在运行期执行执行操作。  但为什么当我页面编码为unicode和Ascii的时候出现不同的结果呢？

user: user-12
content: 定义了一个数组，大小是"早上好"这个字符串的长度(包含结尾的\0), 然后对这个数组初始化，把字符串的内容填进去。 如果是全局变量，那么是编译器做的这些工作。 如果是局部变量，那么是在运行期执行执行操作。