C语言初始化内存分配和销毁

C语言初始化内存分配和销毁

最近做ffmpeg播放的时候,顺带学习了一下C语言的内存分配和销毁;主要讲一下,对于单指针,双指针参数的初始化和销毁是怎么完成的,我们应该选择怎样的形参;

对象定义

定义了一个如下的结构体,这个结构体属于复杂结构体,现在我们要为这个结构体本身以及结构体内部属性分配空间;

c 复制代码
typedef struct VideoState {
	AVFormatContext* formatCtx;
	int				 audioStream;
	AVCodecContext*  aCodecCtx;
	const AVCodec*	 aCodec;
} VideoState;

错误的尝试

一开始我很天真的定义了这样一个初始化函数;

c 复制代码
/**
 初始化VideoState
 */
int init_video_state(VideoState* video_state) {
	video_state = av_malloc(sizeof(VideoState));
	video_state->formatCtx = avformat_alloc_context();
	video_state->aCodecCtx = avcodec_alloc_context3(NULL);
	video_state->audioStream = 0;
	return 1;
}

传入了一个全局指针 VideoState* ,发现初始化的时候报错:

也就是VideoState*在执行av_malloc时 并没有成功的分配内存空间。

原因分析

init_video_state 函数未能正确初始化 VideoState 的原因主要是因为局部变量指针的修改未影响到调用者传入的指针。在 C 语言中,当你传递一个指针到函数中时,任何对这个指针的修改都是局部的,除非你传入的是指针的指针。这样才能对原始指针进行修改。

讲白了,我们在函数中修改入参的时候;对于指针本身的修改都是无效的。

更新后的函数

c 复制代码
/**
 初始化VideoState
 */
int init_video_state(VideoState** video_state) {
	*video_state = av_malloc(sizeof(VideoState));
	(*video_state)->formatCtx = avformat_alloc_context();
	(*video_state)->aCodecCtx = avcodec_alloc_context3(NULL);
	(*video_state)->audioStream = 0;
	return 1;
}
相关推荐
froginwe111 分钟前
CSS3 圆角:实现与优化指南
开发语言
JuicyActiveGilbert27 分钟前
第8天:面向对象编程入门 - 类与对象
开发语言·c++
小麦嵌入式1 小时前
Linux驱动开发实战(一):LED控制驱动详解
linux·c语言·驱动开发·stm32·单片机·嵌入式硬件·ubuntu
狂团商城小师妹1 小时前
JAVA多商户家政同城上门服务预约服务抢单派单+自营商城系统支持小程序+APP+公众号+h5
java·大数据·开发语言·微信小程序·小程序·uni-app·微信公众平台
码叔义2 小时前
Jsonpath 使用说明
android·开发语言·javascript
行十万里人生2 小时前
Qt 对象树详解:从原理到运用
开发语言·数据库·qt·华为od·华为·华为云·harmonyos
原来是猿2 小时前
蓝桥备赛(四)- 数组(下)
开发语言·数据结构·c++·算法
心流时间2 小时前
[Java基础] JVM常量池介绍(BeanUtils.copyProperties(source, target)中的属性值引用的是同一个对象吗)
java·开发语言·jvm
网络安全Ash2 小时前
Python网络安全脚本
开发语言·python·web安全
嵌入式修炼师2 小时前
C语言 enum 的详细解析:用法、注意事项与易错点
c语言