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编码值:![]()