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

C语言 ——— 经典有关动态内存的笔试题

目录

笔试题1

笔试题2

笔试题3 


笔试题1

代码演示:

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

问:

运行 Test 函数会有怎样的结果?是否能正常运行 "hello world" 字符串?

代码解析:

Test 函数中创建了 char* 变量 str ,并赋值为空,将 str 值传递给 GetMemory 函数,GetMemory 函数创建临时指针变量 p 用来接收,并让 p 指向 malloc 动态开辟的 100 个字节的空间,回到 Test 函数后 str 还是空指针,GetMemory 函数并没有改变 str 的指向,所以 strcpy 函数运行时必然会报错,因为要对 str 指针解引用,这就是对空指针解引用操作,程序会直接崩溃

代码验证:


笔试题2

代码演示:

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

问:

现在这个代码运行的结果是什么,为什么? 

代码解析: 

GetMemory 函数创建了一个 char 类型的数组 p ,并存储了 "hello world" 字符串, 最后将 p 这个首地址返回,但是数组 p 的生命周期只在进入 GetMemory 函数时创建,运行完 GetMemory 函数时结束,也就是将 p 数组所存储的空间还给了操作系统,但是 p 是指向这块空间的起始地址,赋值给 str 指针后打印,那么打印的结果只能是随机字符

代码验证:


笔试题3 

代码演示: 

void GetMemory(char** p, int num)
{*p = (char*)malloc(num);
}
void Test()
{char* str = NULL;GetMemory(&str, 100);strcpy(str, "hello world");printf("%s\n", str);
}
int main()
{Test();return 0;
}

问:

代码是否能正常运行,为什么?

代码解析: 

str 址传递给 GetMemory 函数,并开辟了 100 个字节的动态空间,在用 strcpy 函数将 "hello world" 字符串拷贝到 str 指向的动态空间中,最后再打印

代码验证:


http://www.mrgr.cn/news/8152.html

相关文章:

  • 61.旋转链表
  • PPT分享:某集团公司供应链-销售与运营计划SOP
  • DHCP基于接口和基于全局的区别
  • BAT32G137国产项目通用第六节:FreeRTOS 软件定时器
  • 彩虹期权定价
  • 【精选】基于数据可视化的智慧社区内网平台
  • 目标检测 | yolov9 原理和介绍
  • 【Qt】信号和槽
  • 【二叉树---堆的C语言实现】
  • 柔性数组
  • 【学习笔记】时间序列模型(ARIMA)
  • CSS3 3D 转换
  • Python.NET:打开Python与.NET世界互通的大门
  • python 接口自动化数据结构(如列表、字典、元组)
  • 怎样快速搭建 Linux 虚拟机呢?(vagrant 篇)
  • 星转校园二手交易市场平台
  • SpringBoot项目定义Bean常见方式
  • 移动应用平台,企业移动门户就选WorkPlus
  • VSCode搭建Hzero(SpringCloud架构)后端开发调试环境
  • 网络安全审计技术原理与应用