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

C语言 子函数调malloc申请内存返回给主函数使用——可行,但要注意

一般情况,子函数中动态申请内存,将地址返回给主函数,理论上应该也是可以的,需要子函数返回动态内存地址,主函数实参是相应的地址变量即可。只不过,主函数实参传入子函数之前,可能会将指针置空,那么,子函数就不能动态申请内存了。

如下例子:

C语言进阶---动态内存管理_c语言怎么遍历动态申请里面的内容-CSDN博客

4.几个经典的面试题

4.1 题目1:
void Getmemory(char* p)//形参是实参的一份临时拷贝 p是指针变量 p指向NULL *p是NULL
{p = (char*)malloc(100);//p由指向NULL 变为指向malloc开辟空间的起始地址
}
void Test(void)
{char* str = NULL;GetMemory(str);//传的是实参strcpy(str, "helllo world");printf(str);
}
//程序会崩溃无法打印

更正:通过传实参的地址来找到实参在内存当中的位置然后再改变实参的值:

void GetMemory(char** p)//char**p接收str的地址,是一个二级指针
{*p = (char*)malloc(100);//*p==str 由指向NULL 变为指向malloc开辟空间的起始地址
}
void Test(void)
{char* str = NULL;GetMemory(&str);//转str的地址strcpy(str, "helllo world");printf(str);free(str);str = NULL;
}
int main()
{Test();return 0;
}
//程序会正常打印"hello world"

另一个传地址的例子:

4.2题目2:

返回栈空间问题:

char* GetMemory(void)
{char p [] = "hello world";//栈空间开辟数组return p;//p放在寄存器当中,这个函数可以成功返回数组名p,也就是数组的首元素地址}
void Test(void)
{char* str = NULL;str = GetMemory();printf(str);
}
int main()
{Test();return 0;
}
//栈空间在用完之后会被系统回收,因此创建的数组p在GetMemory调用完之后就已经被销毁无法使用了
//str属于是野指针去访问了一块被销毁的空间,因此会打印一些随机值

改为:

int* test()
{int a = 10;return &a;//a的地址被存放在寄存器当中
}
int main()
{int* p = test();//p接收到a的地址printf("%d\n", *p);//p已经是野指针  打印10 因为调用test的栈空间还没有被覆盖printf("%d\n", *p);// 打印随机值 有一次调用test函数,栈空间被新随机值给覆盖return 0;
}

另外,上面所说子函数动态申请内存给主函数用,主函数在使用完要释放。释放后最好置空,否则,其是个野指针,可能会导致错误。

4.3题目3:
void GetMemory(char** p, int num)
{assert(*p);*p = (char*)malloc(num);
}
void tset(void)
{char* str = NULL;GetMemory(&str, 100);strcpy(str, "hello");printf(str);//free释放free(str);str = NULL;
}
int main()
{test();return 0;
}

改正:

void test(void)
{char* str = (char*)malloc(100);strcpy(str, "hello");free(str);//free释放str = NULL;//置空if (str != NULL){strcpy(str, "world");printf(str);//无法打印}
}
int main()
{test();return 0;
}

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

相关文章:

  • Python入门教程之条件语句与运算符优先级详解
  • 高通Camera HAL3: CamX、Chi-CDK要点
  • springboot+vue热带野生动物园景点预约门票订票系统
  • Flutter和Android的混合跳转
  • CyberRT-共享内存实现
  • linux通过串口传输文件
  • uniapp 打包后各静态资源加载失败的问题(背景图,字体等)
  • 关于git hooks
  • mongodb数据库的常用操作语句
  • ubuntu安装完qt后发现找不到图标
  • bazel远程构建(Remote Execution) -- Buildfarm部署中的问题
  • 论文阅读:MedSegDiff: Medical Image Segmentation with Diffusion Probabilistic Model
  • openssl加解密-干货分享
  • 【考研数据结构代码题7】求一元多项式之和
  • python避坑指南(更新中)
  • 可以远程控制电脑桌面的软件有哪些?
  • 洛谷 P1250 种树
  • java大视频在线预览(支持断点下载)
  • OpenCV入门10——特征点检测与匹配
  • 教育机构拒绝“数据陷阱”,群硕将英孚新一代教学管理系统搬上桌
  • 小辰的智慧树(差分+前缀和)
  • Windows如何使用key登录Linux服务器
  • k8s无法删除pv,pvc问题
  • 基于框架的线性回归
  • 万宾科技智能井盖传感器使用方式,具有什么效果?
  • 13.什么是Spring beans?
  • 算法通关村第十二关|白银|字符串经典基础面试题
  • Spring框架学习 -- 读取和存储Bean对象
  • APM工具skywalking部署
  • MFC打开可执行文件exe