今天用vs2008简单的仿照百度文科上的例子写了读取配置文件的win32控制台程序,结果发现当ip的长度多一位时,命令行里就出现了
而当配置文件中的IP少一位是就是正确的,第一行没有烫及其后的。
百度了一下,http://zhidao.baidu.com/question/22534132.html
百度知道:
{if(a[i]!=NULL)outfile<<a[i];}
你这句能比较出字符串何时结束, 但是却没有把结束符输入到数组a中
因为
当a[i]==NULL 的时候, 这个if语句就不成立了, 所以后面的outfile<<a[i]也不会被执行, 解决办法是使用if(a[i-1]!=NULL), 来比较
因为a[i]==NULL的时候, 仍然有a[i-1]!=NULL成立, 所以这个结束符能够被输入到数组a中
所以我就把下面注释的一行改了就好了。
void filem::GetStr(char *str,char ch[]){ int i = 0,flag = 0; f1.getline(n,256); while(str[i] !='\0') { if(str[i] == n[i]) { flag++; } i++; } if(flag == i) { i = 0; while(n[i-1] !='\0') //while(n[i] !='\0') { ch[i] = n[i]; i++; } } }
百度文库有一篇这样说: http://wenku.baidu.com/view/8bff6ea1b0717fd5360cdc07.html
为什么VC经常输出烫烫烫烫烫烫烫烫
在 Debug 模式下, VC 会把未初始化的栈内存全部填成 0xcc,当字符串看就是 烫烫烫烫…… 会把未初始化的堆内存全部填成 0xcd,当字符串看就是 屯屯屯屯…… 可以让我们方便地看出那些内存没初始化
但是 Release 模式下不会有这种附加动作,原来那块内存里是什么就是什么 名字
描述
0xCD Clean Memory 申请的内存由malloc或者new完成
0xDD Dead Memory 释放后的内存,用来检测悬垂指针
0xFD Fence Memory 动态申请后的内存值,没有初始化。用来检测数组的下标界限
0xAB (Allocated Block?) 使用LocalAlloc()分配的内存
0x0DF0ADBA Bad Food 使用LocalAlloc并且参数为LMEM_FIXED,但是还没写入
0xCC 使用了/GZ选项,没有初始化的自动变量在DBGHEAP.C文件中
csdn上有一篇这样说:http://blog.csdn.net/xiakan008/article/details/5958405
浅析"烫烫烫烫"是怎么来的
在用VC写代码时,经常会遇到在栈中申请空间的并且没有被初始化的字符数组就会显示"烫烫烫烫。。。",虽然是知道编译器对栈中没有初始化的数据会进行默认的初始化工作,但是一直不得要领,在拜读《程序员的自我修养》的时候有所收获,还挺有意思的,写出来和大家分享。
代码很简单,就是在栈中申请了一个大小为4个字节的字符数组。
- int main(void)
- {
- char x[4];
- return 0;
- }
用断点查看X的值,可以发现,“烫烫”出现了:
x 0x0012ff60 "烫烫烫烫?" char [4]
查看反汇编:
- 1: int main(void)
- 2: {
- 004113A0 55 push ebp
- 004113A1 8B EC mov ebp,esp
- 004113A3 81 EC CC 00 00 00 sub esp,0CCh
- 004113A9 53 push ebx
- 004113AA 56 push esi
- 004113AB 57 push edi
- 004113AC 8D BD 34 FF FF FF lea edi,[ebp-0CCh]
- 004113B2 B9 33 00 00 00 mov ecx,33h
- 004113B7 B8 CC CC CC CC mov eax,0CCCCCCCCh
- 004113BC F3 AB rep stos dword ptr es:[edi]
- 3: char x[4];
- 4: return 0;
- 004113BE 33 C0 xor eax,eax
- 5: }
简单解释一下关键句的含义:
004113AC 8D BD 34 FF FF FF lea edi,[ebp-0CCh]
将获得的0CCh大小的栈空间首地址赋给edi
004113B2 B9 33 00 00 00 mov ecx,33h
rep的循环次数为33h
004113B7 B8 CC CC CC CC mov eax,0CCCCCCCCh
eax = 0CCCCCCCCh
004113BC F3 AB rep stos dword ptr es:[edi]
将栈空间的33H个双字节赋值为0CCCCCCCCh
而0xcccc用汉语表示刚好就是“烫”
oxcc正好是中断int 3的指令 起到保护作用
在 C++ 的世界里, “烫”和“屯”是我们遇到得最多的两个汉字(限于 VC 用户) 。可能
有人不禁要问:这是为什么呢?
答案是:在 VC 中,栈空间未初始化的字符默认是 -52,补码是 0xCC。两个 0xCC ,即
0xCCCC 在 GBK 编码中就是“烫” ;堆空间未初始化的字符默认是 -51,两个 -51 在 GBK
编码中就是“屯” 。 二者都是未初始化的内存。
C++ 赋予了我们直接面对内存、操作内存的能力,但是内存管理却一直以来被认为是
C++ 语言的一大难点。因为在 C++ 语言中,缺少 GC(垃圾回收器) ,内存管理需要程序员
手动完成,并且还要为可能的失误承担后果。