• 【C】关于动态内存的试题及解析


    目录

     第1题:

     第2题:

     第3题:

     第4题:

     第5题:


     在学习了关于动态开辟内存的相关知识后,下面是一些涉及到动态开辟内存程序的试题及解析(试题部分来自《高质量的C/C++编程》、笔试题)。

    第1题

    分析下面这段代码,为什么运行错误

    代码

    1. void GetMemory(char* p)
    2. {
    3. p = (char*)malloc(100);
    4. }
    5. void Test(void)
    6. {
    7. char* str = NULL;
    8. GetMemory(str);
    9. strcpy(str, "hello,world");
    10. printf(str);
    11. }
    12. int main()
    13. {
    14. Test();
    15. return 0;
    16. }

    解答分析:

    1.对NULL指针进行了解引用操作,程序会崩溃

    2.没有释放空间,内存泄漏的问题

    3.str为指针变量,传递到函数中,只是拷贝了一份也就是p,形参p的改变不影响str,p指向的malloc开辟的空间会在函数外被收回。

    以下是改进后的程序👇

     第2题

    分析下面这段代码,运行结果为什么是乱码?

    代码

    1. char* GetMemory(void)
    2. {
    3. char p[] = "hello world";
    4. return p;
    5. }
    6. void Test(void)
    7. {
    8. char* str = NULL;
    9. str = GetMemory();
    10. printf(str);
    11. }
    12. int main()
    13. {
    14. Test();
    15. return 0;
    16. }

    解答分析:

     p被返回时,p指向的空间同时因为出函数而被系统收回,所以str被赋予野指针,用printf打印str所指空间属于非法访问。

     

     第3题

    分析下面两段代码,为什么结果大不相同??

    代码

    1. int* test()
    2. {
    3. int a = 10;
    4. return &a;
    5. }
    6. int main()
    7. {
    8. int* p=test();
    9. printf("hehe");
    10. printf("%d\n", *p);
    11. return 0;
    12. }

     解答分析:

    从函数栈帧角度分析,test开辟的函数栈帧收回后,没有被系统及时利用,就有可能被指针访问到之前的内容,之后被printf重新利用后,原有内容被覆盖。👇

     第4题

    下面这段程序有什么错误?

    代码

    1. void GetMemory(char** p, int num)
    2. {
    3. *p = (char*)malloc(num);
    4. }
    5. void Test(void)
    6. {
    7. char* str = NULL;
    8. GetMemory(&str, 100);
    9. strcpy(str, "hello");
    10. printf(str);
    11. free(str);
    12. str = NULL;
    13. }
    14. int main()
    15. {
    16. Test();
    17. return 0;
    18. }

     解答分析:

     这段程序能够运行成功,唯一错误的地方就是malloc在开辟内存空间后,没有用free释放这段空间。容易造成内存泄漏。

     用free正确释放malloc开辟的空间👇

     第5题

    为什么下面这段程序运行结果为乱码??

    代码

    1. void Test(void)
    2. {
    3. char* str = (char*)malloc(100);
    4. strcpy(str, "hello");
    5. free(str);
    6. str = NULL;
    7. if (str != NULL)
    8. {
    9. strcpy(str, "world");
    10. printf(str);
    11. }
    12. }
    13. int main()
    14. {
    15. Test();
    16. return 0;
    17. }

    解答分析:

    str所指的空间被free释放后,空间交换给系统,str变为野指针,属于非法访问。

    在free释放str所指向空间后应该及时str=NULL置空,且不能在访问。

  • 相关阅读:
    python数学建模--模拟退火算法求解一元函数极值
    定制开发APP 需要注意什么?
    Flink 1.13 源码解析——Flink 作业提交流程
    2021年JAVA 精心整理的常见面试题-附详细答案【持续更新~~】
    springboot+安卓app电子阅览室系统毕业设计源码016514
    mindspore如何处理网络训练过程中loss异常的问题
    Elasticsearch深入理解(十五)——版本冲突问题解决方案
    C++ 多线程 Thread类
    Unity 编辑器常用方法
    Python数据透视表
  • 原文地址:https://blog.csdn.net/m0_64476561/article/details/134063881