【C】动态内存管理经典面试题

简介: 动态内存管理经典笔试题 理解更上一层楼

1.几个经典的笔试题

题目1:

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

请问这个函数有什么错误?

注意:printf(str);这种写法是正确的。

主要错误如下:

1.改变形参p,str依然是NULL,strcpy无法将”hello world”拷贝到空指针指向的地址,所以会访问出错。

2.malloc开辟的动态内存空间需要进行free释放。

代码改进:

题目2:

char* GetMemory(void)
{
    char p[] = "hello world";
    return p;
}
void Test(void)
{
    char* str = NULL;
    str = GetMemory();
    printf(str);
}
int main()
{
    Test();
    return 0;
}

请问这个函数有什么错误?

而上图中第二个代码的写法虽然是错误的,但是在运行后可能会得到10,这时只要略作修改就得不到原来得值,如下,我们添加了输出项,对应的输出结果如下图:

究其原因,涉及到函数栈帧的部分知识:

题目3:

void GetMemory(char **p, int num)
{
    *p = (char *)malloc(num);
}
void Test(void)
{
    char *str = NULL;
    GetMemory(&str, 100);
    strcpy(str, "hello");
    printf(str);
}

请问这个函数有什么错误? 通过前面的学习,我们应该可以很快地找出错误

错误:

malloc函数开辟了内存空间,但是却没有释放,造成了内存泄露地问题。
这时,我们只需在后面加上
free(str);
str = NULL;即可,
改进代码如下:

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:

void Test(void)
{
    char* str = (char*)malloc(100);
    strcpy(str, "hello");
    free(str);//free释放开辟的动态内存空间,而不置空
    if (str != NULL)//str为真
    {
        //str所指向的地址不属于当前程序,是野指针,这里是非法访问
        strcpy(str, "world");
        printf(str);
    }
}
int main()
{
    Test();
    return 0;
}

该代码中free函数释放了malloc开辟的动态内存空间,但是没有将指针置空,导致后面调用时出现了野指针导致了非法访问。

所以一个好的代码习惯是在释放动态内存空间后,将这个空间的指针置为空。

相关文章
|
7月前
|
安全 Linux C++
【C++】内存管理常见面试题
【C++】内存管理常见面试题
37 0
|
7月前
|
Java Linux 程序员
Linux平台中调试C/C++内存泄漏方法 (腾讯和MTK面试的时候问到的)
Linux平台中调试C/C++内存泄漏方法 (腾讯和MTK面试的时候问到的)
|
12天前
|
编译器 程序员 C语言
从C语言到C++⑨(第三章_C&C++内存管理)详解new和delete+面试题笔试题(下)
从C语言到C++⑨(第三章_C&C++内存管理)详解new和delete+面试题笔试题
8 0
|
12天前
|
编译器 C语言 C++
从C语言到C++⑨(第三章_C&C++内存管理)详解new和delete+面试题笔试题(中)
从C语言到C++⑨(第三章_C&C++内存管理)详解new和delete+面试题笔试题
25 0
|
12天前
|
存储 程序员 编译器
从C语言到C++⑨(第三章_C&C++内存管理)详解new和delete+面试题笔试题(上)
从C语言到C++⑨(第三章_C&C++内存管理)详解new和delete+面试题笔试题
20 0
|
16天前
|
移动开发 前端开发 JavaScript
Java和web前端,IT新人该如何选择?,2024年最新Web前端内存优化面试
Java和web前端,IT新人该如何选择?,2024年最新Web前端内存优化面试
|
17天前
|
Java Android开发 Linux
android内存优化面试题,挑战大厂重燃激情
android内存优化面试题,挑战大厂重燃激情
|
18天前
|
存储 NoSQL 算法
Redis源码、面试指南(2)内存编码数据结构(下)
Redis源码、面试指南(2)内存编码数据结构
27 4
|
18天前
|
存储 NoSQL API
Redis源码、面试指南(2)内存编码数据结构(上)
Redis源码、面试指南(2)内存编码数据结构
30 0
|
8月前
|
存储 JavaScript 前端开发
手撕前端面试题【javascript~ 列表动态渲染、无重复数组、数组排序、新数组、创建数组、深浅拷贝、内存泄露等】
html页面的骨架,相当于人的骨头,只有骨头是不是看着有点瘆人,只有HTML也是如此。 css,相当于把骨架修饰起来,相当于人的皮肉。
42 0