目录
1.
答案速查
分析
源代码分析
反汇编代码分析(底层)
2.
答案速查
分析
3.
答案速查
分析
VS逐步调试
1.
求下列代码的执行结果
#include <stdio.h>
char* GetMemory(void)
{char p[] = "hello world";return p;
}void Test(void)
{char* str = NULL;str = GetMemory();printf(str);
}int main()
{Test();return 0;
}
答案速查
乱码
分别是x86+debug和x64+debug下的运行结果
分析
源代码分析
GetMemory函数的p返回后,函数退出,栈空间(本题的hello world)会被销毁,交还操作系统,由操作系统来处理
此时printf(str);没有作用,str指向的hello world已经不存在,相当于str为野指针
反汇编代码分析(底层)
会单开一篇文章分析
2.
求下列代码的执行结果
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void GetMemory(char** p, int num)
{*p = (char*)malloc(num);
}void Test(void)
{char* str = NULL;GetMemory(&str, 100);strcpy(str, "hello");printf(str);
}int main()
{Test();return 0;
}
答案速查
分析
虽然能成功打印,但是有两处不规范的地方
1.malloc函数的返回值没有判断是否为空指针
2.有malloc但没有free,容易发生内存泄漏
具体分析和改法类似71.【C语言】动态内存管理(重点)(4)
3.
求下列代码的执行结果
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void Test(void)
{char* str = (char*)malloc(100);strcpy(str, "hello");free(str);if (str != NULL){strcpy(str, "world");printf(str);}
}int main()
{Test();return 0;
}
答案速查
分析
一个很明显不规范的地方
strcpy(str, "hello");free(str);if (str != NULL)
备注:"hello"字符串 实际上在末尾有一个\0
VS报警告:
free后没有为str置为NULL(注:free函数不会自动为str置为NULL),导致str为野指针
使(str != NULL)成立,导致非法访问(strcpy(str, "world"); printf(str);)
VS逐步调试
free函数执行完后,被VS写入dd字符数组