0

在为 Apache Web 服务器构建模块时,我遇到了几个实例,其中结构的声明说它只接受和const char*声明中的成员,但是我在各种模块(例如 mod_security,甚至新函数)中找到了示例表示正在将数据类型插入到这些结构中。apr_table_tapr_array_header_tap_parse_form_datavoid *

我的问题是这怎么可能?如果我尝试使用相同的方法,为什么我的 Visual Studio 编译器会抱怨?

一个很好的例子是带有 create_request 函数的 mod_security,该函数将 a 存储void *request_rec便笺中。

4

1 回答 1

1

指针是可转换的,并且每个对象指针类型都可以转换为void*,因为在 a 中存储任何指针void*都不会丢失信息。也就是说,以下是有效的:

struct Foo a;
struct Foo * p = &a;   // p points to a

void * q = p;          // OK, can store the value of p in q

struct Foo * r = q;    // OK too - we can go back, and r points to a

r->n = 1;

因此,在 C 中习惯将指针传递为void*,因为知道这些指针始终可以保存任何其他对象指针值,并且仅在需要时将其转换回所需的类型。

char关于指针的最后一句话:将任何对象指针转换char*为指向字符数组的指针并实际取消引用它并不构成类型双关语,也不违反严格的别名规则——这只是允许您访问底层任何对象的二进制表示。

于 2012-05-12T23:22:44.310 回答