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;
}