当前位置: 首页 > news >正文

动态内存经典笔试题分析

目录

1.题目一

2.题目二

3.题目三

4.题目四


1.题目一

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
void GetMemory(char* p)
{p = (char*)malloc(100);
}
void Test(void)
{char* str = NULL;GetMemory(str);strcpy(str, "hello world");printf(str);
}
int main()
{Test();return 0;
}

请问运行Test 函数会有什么样的结果?

程序崩溃。出了函数,局部变量p已经销毁,函数返回后,str依然为空指针,把hello world拷贝放到空指针指向的空间去,拷贝必然存在对空指针的解引用操作,程序就会崩溃。

这部分代码要表达的意思其实是想把malloc开辟的100个字节的空间的地址传给str,接着拷贝内容。上面代码由于采用值传递,形参是实参的一份临时拷贝,导致创建形参p,对形参p的修改不会影响实参

正确写法: 

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
void GetMemory(char** p) //二级指针接收
{*p = (char*)malloc(100);
}
void Test(void)
{char* str = NULL;GetMemory(&str); //一级指针变量的地址   传址调用strcpy(str, "hello world");printf(str);free(str);str = NULL;
}
int main()
{Test();return 0;
}

运行结果:


2.题目二

#include<stdlib.h>
#include<stdio.h>
#include<string.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;
}

请问运行Test 函数会有什么样的结果?

运行结果:

可能正常打印,也可能程序崩溃出了GetMemory函数,数组p销毁,p指向的内存空间已经还给操作系统了,这是返回栈空间地址的问题。函数返回后,str接收的就是野指针

情况1:当跳出函数后,恰好p指向的空间没有被操作系统使用,就可以打印出来hello world。

情况2:当跳出函数后,p指向的空间已经被覆盖了,就不能完成任务。

情况1: 

情况2: 


3.题目三

#include<stdlib.h>
#include<stdio.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;
}

以上代码有什么问题?

运行结果:

没有释放空间

正确写法: 

#include<stdlib.h>
#include<stdio.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);free(str);str = NULL;
}
int main()
{Test();return 0;
}

4.题目四

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
void Test(void)
{char* str = (char*)malloc(100);strcpy(str, "hello");free(str); //str没有置为空指针if (str != NULL){strcpy(str, "world");printf(str);}
}
int main()
{Test();return 0;
}

请问运行Test 函数会有什么样的结果?

运行结果:

通过free把str指向的空间释放掉,那块空间已经还给操作系统了,我们已经没有使用权限了,但是str仍然指向那块空间。 strcpy函数拷贝时,str是野指针,world\0把hello\0覆盖掉,造成非法访问(篡改)内存。所以要把str置为空。


http://www.lryc.cn/news/403923.html

相关文章:

  • JS设计模式(一)单例模式
  • uniapp动态计算并设置元素高度
  • 直播架构如何设计核心节点和边缘节点
  • 自动驾驶-预测概览
  • 基于PSO算法优化PID参数的一些问题
  • 什么是决策树?
  • ASP 快速参考
  • (二)原生js案例之数码时钟计时
  • [CSS] 浮动布局的深入理解与应用
  • Linux云计算 |【第一阶段】ENGINEER-DAY2
  • 9.11和9.9哪个大?
  • 学懂C语言(十二):C语言中的二进制原理及应用
  • 科研绘图系列:R语言雨云图(Raincloud plot)
  • 优化教学流程和架构:构建高效学习环境的关键步骤
  • js | this 指向问题
  • 《昇思 25 天学习打卡营第 15 天 | 基于MindNLP+MusicGen生成自己的个性化音乐 》
  • Gitee 使用教程1-SSH 公钥设置
  • 理解Cookie、Session和Token
  • 概率论原理精解【1】
  • 数据结构(二叉树-1)
  • 巴黎奥运会倒计时 一个非常不错的倒计时提醒
  • 【Python】使用库 -- 详解
  • Web3D:WebGL为什么在渲染性能上输给了WebGPU。
  • SpringBoot面试高频总结01
  • Linux 工作队列(Workqueue):概念与实现
  • 前端页面是如何禁止被查看源码、被下载,被爬取,以及破解方法
  • 51单片机嵌入式开发:14、STC89C52RC 之HX1838红外解码NEC+数码管+串口打印+LED显示
  • 在不同环境中,Java应用程序和MySQL等是如何与Docker进行交互和操作的?
  • 《DRL》P10-P15-损失函数-优化(梯度下降和误差的反向传播)
  • Spring Boot项目的404是如何发生的