自学内容网 自学内容网

E37.【C语言】动态内存管理练习题

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字符数组


原文地址:https://blog.csdn.net/2401_85828611/article/details/142726366

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!