您的位置:首页 > 房产 > 家装 > 微博推广报价_bim网站_百度地图优化排名方法_餐饮营销方案100例

微博推广报价_bim网站_百度地图优化排名方法_餐饮营销方案100例

2025/4/3 9:21:44 来源:https://blog.csdn.net/m0_51433562/article/details/145896524  浏览:    关键词:微博推广报价_bim网站_百度地图优化排名方法_餐饮营销方案100例
微博推广报价_bim网站_百度地图优化排名方法_餐饮营销方案100例

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

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

对象定义

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

typedef struct VideoState {AVFormatContext* formatCtx;int				 audioStream;AVCodecContext*  aCodecCtx;const AVCodec*	 aCodec;
} VideoState;

错误的尝试

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

/**初始化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 语言中,当你传递一个指针到函数中时,任何对这个指针的修改都是局部的,除非你传入的是指针的指针。这样才能对原始指针进行修改

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

更新后的函数

/**初始化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;
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com