void*array =*(void**)member + siz*(*p_n)的目的是什么?

geo*_*org 6 c c99 protocol-buffers c89

我正在尝试使用C90编译器(MS VS2012)编译protobuf-c示例.

在protobuf-c源代码中,有两个C99特定的东西可以很容易地改变为与C90兼容,即在范围中间的变量声明(C90中不允许)和通过-syntax 实例化结构.(例如some_struct_type name = {.a=1,.b=2}) .

我现在卡住了一个编译错误.源文件'protobuf-cc'中的相应行读取:

void *array = *(void **) member + siz * (*p_n);
Run Code Online (Sandbox Code Playgroud)

哪里member是定义为void *p_n作为size_t *.各自的错误是

error C2036: 'void *' : unknown size
Run Code Online (Sandbox Code Playgroud)

请注意,这对protobuf-c版本1.0.1有效(请参阅相应的源代码,第2404行).此行已在版本1.0.2中更改为

void *array = *(char **) member + siz * (*p_n);
Run Code Online (Sandbox Code Playgroud)

这个评论.因此更改行会消除编译错误.

我的问题是:

  • 我想了解这行代码.
  • 我可以切换到*(char **)版本吗?
  • 告诉我的错误信息是什么?

(出于其他原因,我想坚持使用protobuf-c 1.0.1)

250*_*501 4

传递的参数member是指向 char 指针的指针的地址。首先,强制转换和引用获取该指针。(传递指针的地址,以便可以在函数中更改指针。)

添加操作siz * (*p_n)会增加指向正确元素的指针。

整行代码可以重写为:

char** pm = member ;
char* m = *pm ;
void *array = m + siz * (*p_n);
Run Code Online (Sandbox Code Playgroud)

从 void* 更改为 char* 以便可以进行指针算术,因为 C 标准不允许在 void 指针上进行这种算术。错误消息告诉您, void* 指向的对象的大小未知,因此您必须使用 char* 指针。

只要传递给函数的对象具有char**您可以切换到 char** 版本的类型。