【发布时间】:2015-04-06 14:27:58
【问题描述】:
我读到 void 指针可以从任何指针隐式转换为,但似乎它们不适用于结构,我举了一个例子:
typedef struct FOO{
int *arr;
size_t size;
} FOO;
int main()
{
void * a;
FOO * b = (FOO*)malloc(sizeof(FOO));
a = b;
b->arr;//works, accessed arr
a->arr;//error: expression must have pointer-to-struct-or-union type
}
我可以看到a 和b 有相同的地址,但我不能使用a,因为它与b 的类型相同,这是为什么呢?
另一个相关的问题是,绝对可以将任何指针隐式转换为void * 吗?比如FOO**** 到void*?
【问题讨论】:
-
标准警告:请do not cast
malloc()和C中的家人的返回值。 -
@SouravGhosh 嗯,我使用 VS,所以这是我所知道的标准......
-
对于您的相关问题,除了指向函数的指针之外,任何指针都不能保证它们的大小。
-
对于词汇表,C 中的 casts 是那些你在前面写
(void*)之类的转换。这些是显式 转换,您的代码通常不应包含其中任何一个。您在a = b中所做的是从另一个指针类型 到void*的隐式转换。 -
为什么代码不应该包含显式转换? @JensGustedt