zoukankan      html  css  js  c++  java
  • 烫烫烫烫

    今天用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个字节的字符数组。

    1. int main(void)  
    2. {  
    3.     char x[4];  
    4.     return 0;  
    5. }  

    用断点查看X的值,可以发现,“烫烫”出现了:

    x 0x0012ff60 "烫烫烫烫?" char [4]

    查看反汇编:

    1.      1: int main(void)  
    2.      2: {  
    3. 004113A0 55               push        ebp    
    4. 004113A1 8B EC            mov         ebp,esp   
    5. 004113A3 81 EC CC 00 00 00 sub         esp,0CCh   
    6. 004113A9 53               push        ebx    
    7. 004113AA 56               push        esi    
    8. 004113AB 57               push        edi    
    9. 004113AC 8D BD 34 FF FF FF lea         edi,[ebp-0CCh]   
    10. 004113B2 B9 33 00 00 00   mov         ecx,33h   
    11. 004113B7 B8 CC CC CC CC   mov         eax,0CCCCCCCCh   
    12. 004113BC F3 AB            rep stos    dword ptr es:[edi]   
    13.      3:     char x[4];  
    14.      4:     return 0;  
    15. 004113BE 33 C0            xor         eax,eax   
    16.      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(垃圾回收器) ,内存管理需要程序员
    手动完成,并且还要为可能的失误承担后果。

  • 相关阅读:
    http://blog.csdn.net/jyw935478490/article/details/51233931
    http://www.roncoo.com/article/detail/124661
    http://blog.csdn.net/chenleixing/article/details/43740759
    http://www.xttblog.com/?p=794
    http://jingyan.baidu.com/article/2009576193ee38cb0721b416.html
    Java 生成16/32位 MD5
    AI(Adobe Illustrator)简单入门——骷髅
    AI(Adobe Illustrator)简单入门——米老鼠
    ovirt-engine安装
    service postgresql initdb [FAILED]
  • 原文地址:https://www.cnblogs.com/youngt/p/3037132.html
Copyright © 2011-2022 走看看