首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >void *array = *(void **)成员+ siz *(*p_n)的目的是什么?

void *array = *(void **)成员+ siz *(*p_n)的目的是什么?
EN

Stack Overflow用户
提问于 2014-10-21 13:52:52
回答 2查看 199关注 0票数 6

我试图获得一个用原装c编译器(MS VS2012)编译的C90示例。

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

我现在只剩下一个编译错误。源文件'protobuf-c.c‘中的相应行如下:

代码语言:javascript
复制
void *array = *(void **) member + siz * (*p_n);

其中member定义为void *p_n定义为size_t *。而相应的错误是

代码语言:javascript
复制
error C2036: 'void *' : unknown size

请注意,对于protobuf-c版本1.0.1 (参见各自源代码,第2404行),这是有效的。此行已在版本1.0.2中更改为

代码语言:javascript
复制
void *array = *(char **) member + siz * (*p_n);

这句话。因此,更改行将消除编译错误。

我的问题是:

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

(出于其他原因,我想坚持使用Protobuf-c1.0.1)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-21 14:04:03

作为member传递的参数是指向char指针的指针的地址。首先,转换和延迟获得该指针。(传递指针的地址,以便在函数中更改指针。)

加法siz * (*p_n)增加指向正确元素的指针。

整行可以改写为:

代码语言:javascript
复制
char** pm = member ;
char* m = *pm ;
void *array = m + siz * (*p_n);

从void*更改为char*,这样指针算术是可能的,因为C Standard不允许在空指针上使用指针。错误消息告诉您,对象void*所指向的对象的大小是未知的,因此必须使用char*指针。

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

票数 4
EN

Stack Overflow用户

发布于 2014-10-21 14:03:53

I would like to understand this line of code.

代码生成指针算法并试图隐藏详细信息。因此,它在任何地方都使用void,指针不被延迟。假设sizeof (*(void*))等于1。

Can I switch to the *(char **) version?

是的,因为代码分配结果指针,而不取消指针。

What is the error message telling me?

这个黑客是编译器特有的。您的编译器没有取消这一点,它没有提供void*目标的大小。

您应该使用“可移植”版本。对于大多数编译器来说,sizeof(char)是一个,对于这些编译器来说,它是可移植的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26488432

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档