先看某开源库的代码:
AVFrame *av_frame_alloc(void)
{
AVFrame *frame = av_mallocz(sizeof(*frame));
if (!frame)
return NULL;
frame->extended_data = NULL;
get_frame_defaults(frame);
return frame;
}
看av_frame_alloc()里面的第一条语句,调用av_mallocz()将返回的指针赋值给frame,但是av_mallocz()需要一个size_t(整型)类型的参数,这里使用操作符sizeof(*frame), frame是在赋值等号左边定义的AVFrame结构图类型的指针,如果是sizeof(frame),是分配指针的大小的内存,sizeof(*frame)是分配AVFrame结构体的大小的内存吗?确实是如此。
乍一看,av_frame_alloc()函数的形参是void类型,这个frame也不是全局变量,这个frame是赋值语句左边刚刚定义的frame,只是他指向野区(有可能是NULL),但是我们可以使用它进行指针解引用*frame,不会报任何异常;但是如果去掉下面的if(!frame),去执行对frame->extende_data的赋值操作,就会报警告 C6011 取消对NULL指针XXX的引用。
也就是说上面的代码相当于:
AVFrame *av_frame_alloc(void)
{
AVFrame *frame;
frame = av_mallocz(sizeof(*frame));
if (!frame)
return NULL;
frame->extended_data = NULL;
get_frame_defaults(frame);
return frame;
}
也可以用另外一个小的实验去验证:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char name[20];
int id;
} Student;
int main(char **argv, int argc)
{
Student *p = (Student*)malloc(sizeof(*p));
if (p == NULL) {
return -1;
}
p->id = 1234;
strcpy_s(p->name, 20, "David");
printf("student id: %d, name: %s\n", p->id, p->name);
return 0;
}
运行结果也正常。
------------------
char name[20] = "csdn.net";
char *p = name;
int sz = sizeof(name); // sz是数组的长度:20
int szp = sizeof(p); // szp是指针类型的长度,32bit平台 4字节
int szc = sizeof(*p); // szc是char类型的长度:1字节