关于函数返回值/打印语句为忐或烫的问题

问题① 函数返回值为“忐”
 
 
 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\n", 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编码值:
 


 
 
 
 

转载于:https://www.cnblogs.com/gxcdream/p/11442773.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值