zoukankan      html  css  js  c++  java
  • 关于函数返回值/打印语句为忐或烫的问题

    问题① 函数返回值为“忐”
     
     
     1 #include<stdio.h>
     2 char *myString()
     3 {
     4     char buffer[6] = {0};
     5     char *s = "Hello World!";
     6     for (int i = 0; i < sizeof(buffer) - 1; i++)
     7     {
     8         buffer[i] = *(s + i);
     9     }
    10     return buffer;
    11 }
    12 int main(int argc, char **argv)
    13 {
    14     printf("%s
    ", myString());
    15     return 0;
    16 }

     

    解释
    函数char *myString()中没有使用new或者malloc分配内存,所有buffer数组的内存区域在栈区。随着char *myString()的结束,栈区内存释放,字符数组也就不存在了,所以会产生野指针,输出结果未知。
     

    问题② 打印语句出现“烫烫烫”
     
    首先,这个现象只会在windows下用vs或者vc编程时才出现,并且只会出现在debug版本的运行过程中。
    如果在类unix系统下,使用gcc或者clang编译器,你得到得通常会是提示segmentation fault.
    vc或者vs在debug版本的程序初始化时,会将栈内未初始化的内存的每个字节设置成0xcc,这个代表的是一个特殊的中断机器码,int 3,准确地说是软件调试中断,利用这个中断产生的异常,我们可以获得ring0级别的kernel权限。注意,这里的int是interrupt的意思,不是integer。将这些内存初始化成这个样子是为了方便用户进行断点调试。
    然而,当你的程序访问了未初始化的栈内存时,例如数组越界,就会得到这个特殊字节。在你把它打印出来时,通常会进行ascii码的映射。可是,0xcc对应的十进制是204,然而ascii码的范围是0~127啊!对此,对于一个超过ascii码表示范围的字符,程序通常会尝试使用unicode编码,unicode编码是16位的,所以0xcc会被扩展称为0xcccc,我们验证一下“烫”的unicode编码值:
     


  • 相关阅读:
    「USACO15FEB」Censoring (Silver) 审查(银) 解题报告
    「Luogu P2278」[HNOI2003]操作系统 解题报告
    「Luogu P1210」回文检测 解题报告
    「Luogu P4987」回文项链 解题报告
    「Luogu P1435」回文字串 解题报告
    「Luogu P3931」SAC E#1
    「UVA1328」Period 解题报告
    「Poj1845」Sumdiv 解题报告
    测试
    nginx、Apache、Lighttpd启用HSTS
  • 原文地址:https://www.cnblogs.com/gxcdream/p/11442773.html
Copyright © 2011-2022 走看看