文章目录

  • 经典笔试题
    • 1.未返回地址导致开辟无效
    • 2.返回栈空间地址问题
    • 3.内存泄漏
    • 4.提前释放导致的非法访问

经典笔试题

1.未返回地址导致开辟无效

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

这个代码能正常运行吗?
如果能的话,会输出什么?
如果不能的话,为什么不能?哪里出现问题?几个问题?怎么改进?

运行结果:
程序崩溃
原因:str中存放NULL,text函数将str的值传给p,即指针p存放NULL,
而后又让p指向一个100大小的空间,此时p存放这个空间的地址。
GetMemory函数结束void类型不返回参数,该函数内的局部变量销毁,
指针p被销毁。动态开辟的内存还未释放并且无法找到而str中还存放着NULL,
无法存放"hello world",导致程序崩溃。

改进代码(使用二级指针进行参数传址):

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;
}

2.返回栈空间地址问题

#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;
}

这个代码运行后有什么样的结果?

返回乱码
原因:非法访问,
在第一个函数时创建了一个字符串数组p,又返回了p的地址,
但p为局部变量,在第一个程序结束时释放p的空间即所存放的内容消失,
p变为一个野指针,所返回的地址未存放内容,所以属于非法访问。

代码改进

1.使用static修饰p数组,局部变量被sratic修饰后生命周期变长,程序结束时不会被销毁。
2.使用malloc函数开辟空间来代替p数组,因为malloc函数开辟的空间存放在堆区,只会在整个所有代码结束时才会被销毁。

3.内存泄漏

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

这个代码运行后有什么样的结果?

忘记释放动态开辟的内存,导致内存泄漏

4.提前释放导致的非法访问

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

这个代码运行后有什么样的结果?
输出结果会是什么呢?
输出结果:world

在str被释放后,所指向的内存已经返还给了操作系统,
而后面的str强制访问属于操作系统的空间。后面存储的world将前面的数据覆盖,
导致只会输出world。

动态内存分配——经典笔试题相关推荐

  1. C语言:动态内存分配+经典面试题

    前言: 通常,我们在栈空间开辟的内存都是固定的,这是十分不方便使用的.为了更加灵活的分配和使用内存,我们要学习C语言中一些常用的与内存分配相关联的函数.顺便,我们会补充数组中柔性数组的知识. 内存分区 ...

  2. 【C/C++动态内存 or 柔性数组】——对动态内存分配以及柔性数组的概念进行详细解读(张三 or 李四)

    目录 前言(栈区.堆区.静态区) 动态内存函数 malloc与free calloc与free realloc与free 常见的动态内存错误 经典笔试题(再见张三) 柔性数组 前言(栈区.堆区.静态区 ...

  3. C语言第十三课,动态内存分配

    动态内存分配的空间放在堆区.动态内存函数主要有:malloc,calloc,realloc 动态内存函数的介绍 malloc 申请一个空间,大小是size的大小,指向的一个类型不明,因为在设计的时候, ...

  4. 嵌入式常见经典笔试题

    嵌入式常见经典笔试题 2012-1-6 15:09:49    收藏  |  打印  | 投票(0)  |  评论(0)  |  阅读(130)  ◇字体:[大 中 小] 预处理器(Preproces ...

  5. C语言动态内存分配详解

    文章目录 前言 一.为什么存在动态内存分配 1.已掌握的内存开辟方式 2.上述开辟空间方式的特点 3.为什么存在动态内存分配 二.动态内存函数的介绍 1.malloc 2.free 3.calloc ...

  6. [转载] 硬件工程师经典笔试题集锦---(张飞实战电子)

    [别找了全在这]硬件工程师经典笔试题集锦! 直转链接:https://www.sohu.com/a/312704438_819258 数字电路知识问题,请简要回答之. (1) 什么是 Setup和 H ...

  7. 浅谈C语言动态内存分配及柔性数组

    文章目录 前言 1.动态内存的简单介绍 1.动态内存分配是什么? 2.为什么存在动态内存分配? 3.动态内存分配具体方法 1.动态内存函数 2.动态内存注意事项 2.经典面试题分析 3.C/C++程序 ...

  8. 【 C 】动态内存分配案例分析

    声明一个指向char类型的指针,可以在声明的时候就对其进行初始化,这样是合理的. 例如: E1: #include <stdio.h> #include <stdlib.h> ...

  9. 【C 语言】内存管理 ( 动态内存分配 | 栈 | 堆 | 静态存储区 | 内存布局 | 野指针 )

    相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...

最新文章

  1. WdatePicker,js日期插件 ,时间相加
  2. Java特性-Collection和Map
  3. Neo4j CQL - (3) -RETURN子句
  4. ant system property
  5. 不同主体公众号跳转小程序_公众号和小程序的区别
  6. 虚拟机VMware Workstation与主机间共享文件(利用虚拟光驱)
  7. 【问题待解决】自定义控件设计界面报错,编译运行正常
  8. C++新标准——C++1x
  9. softmax和cross_entropy
  10. html好看的详情页面设计,40多个漂亮的网页表单设计实例
  11. Winner-Take-All Autoencoders ( 赢者通吃自编码器)
  12. Python进程池之pool.map()函数传入多参数
  13. 【创意logo】我们与你同在
  14. 织梦DedeCMS在自定义表单里加入验证码的方法
  15. ☆☆☆☆☆图像类找工作面试问题☆☆☆☆☆
  16. 基于EasyExcel的读取exl并返回成功/失败数量及原因,并将导入失败exl的导出到系统路径中
  17. Jackson 化学发光免疫印迹解决方案
  18. mariadb登陆异常_ERROR 2003 (HY000) Can‘t connect to MySQL server on ‘XXX‘ (111)
  19. 802.11ax TWT详解2
  20. word/ppt插入操作

热门文章

  1. 基于JAVA的高校教务管理系统
  2. OSChina 周一乱弹 —— 编程从娃娃抓起,你怕了吗?
  3. 级联列表(八大菜系)
  4. cad绘制正八边形_cad怎么绘制绘制八角凳图纸?
  5. rstp协议学习笔记
  6. 用深度学习来辅助识别生死狙击4399人物演示
  7. Mac M1 Java开发环境搭建
  8. 宝宝1周岁生日祝福语
  9. can帧格式 dlc_是时候聊一下CAN总线了(下)——CAN总线帧格式
  10. Circle seal 532B-1M-1限压阀