手持两把锟斤拷, 口中疾呼烫烫烫。
脚踏千朵屯屯屯, 笑看万物锘锘锘。
烫烫烫
简单点说,最常见的就是数组没初始化 并且按照%s 输出了。
#include<stdio.h>
int main()
{
char a[5];
a[0] = 'a';//只赋了第一个值
printf("%s\n",a);
return 0;
}
在windows平台下,ms的编译器在 Debug 模式下,会把代码中未初始化的栈内存全部填成 0xcc,用字符串来看就是"烫烫烫烫烫烫烫"
在Visual Studio(或vc++)中的Debug模式下【gcc编译器是另一回事】,如果声明一个变量,但是没有初始化,微软会给未初始化的内存赋值为0xCC。给为初始化的内存赋0xCC是有原因的,0xCC其实是INT3中断指令【这里涉及到汇编语言】,所以如果在Debug模式下试图去执行这块未初始化的内存的话就会中断程序。
屯屯屯
简单点说,最常见的就是 malloc后没初始化 并且按照 %s 输出了。
#include<stdio.h>
#include<malloc.h>
int main()
{
char *p;
p = (char *)malloc(16);
if (p)
printf("%s", p);//p没赋值、没初始化,直接输出
free(p);
return 0;
}
在windows平台下,ms的编译器在 Debug 模式下,会把代码中未初始化的堆内存全部填成0xcd,用字符串看就是“屯屯屯屯屯屯屯屯”。
——堆内存和栈内存详解【此处涉及计算机操作系统】
1、栈区(stack)—由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈
2、堆区(heap)— 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表
============================以下两个涉及(中文)字符编码问题=================================
锟斤拷
UTF-8转汉字编码
#include<stdio.h>
int main()
{
char *a = "\xef\xbf\xbd\xef\xbf\xbd";
printf("%s\n", a);
return 0;
}
锟斤拷则涉及unicode字符集转换问题,Unicode和老编码体系的转化过程中,肯定有一些字,用Unicode是没法表示的,Unicode官方用了一个占位符来表示这些文字,这就是:U+FFFD REPLACEMENT CHARACTER。U+FFFD的UTF-8编码是0xEFBFBD,如果重复多次形成:EFBFBDEFBFBDEFBFBD
反复屡次,然后在GBK/CP936/GB2312/GB18030的环境(都是中国标准惹的祸)中显示的话,一个汉字2个字节,最终的结果就是:锟斤拷——锟(0xEFBF),斤(0xBDEF),拷(0xBFBD)……
锘锘锘
微软在 UTF-8 文件头部加上了 EF BB BF BOM 标志。在不支持 BOM 的环境下对其停止 UTF-8 解码失掉"锘"字。
#include<stdio.h>
int main()
{
char *a = "\xef\xbb";
printf("%s\n", a);
return 0;
}
BOM 是 Byte Order Mark 的缩写。是UTF编码方案里用于标识编码的标准标记,在UTF-16里本来是FF FE,变成UTF-8就成了EF BB BF。这个标记是可选的,因为UTF8字节没有顺序,所以它可以被用来检测一个字节流是否是UTF-8编码的。
- 锘EFBB
- 匡BFEF
- 豢BBBF
【可能的操作原因】:出现这个问题肯定是你写网页的时候用了记事本 ,记事本在保存文件的时候把原本文件的编码改了记事本会默认保存为UTF-8的编码,而如果你原本网页是GBK编码的,就会出现乱码~
(字符编码涉及数据读取方式的不同,所以会显示出我们不希望看到的东西……)