在c中有一个结构的void *成员是什么意思?

时间:2014-07-06 13:44:09

标签: c struct void-pointers

我不明白mystery成员在下面是什么类型的财产:

typedef struct _myobject
    {
        long number;
        void *mystery;
    } t_myobject;

这位void会员是什么类型的会员?这需要多少内存?我在哪里可以获得有关完成内容的更多信息(例如,为什么会使用void成员?)

编辑 - 更新标题,说无效*

4 个答案:

答案 0 :(得分:2)

void*变量是指向内存中地址的“通用”指针。

字段mystery本身在内存中消耗sizeof(void*)个字节,通常为4或8,具体取决于您的系统(基于虚拟内存地址空间的大小,更准确)。但是,它可能指向一些消耗不同内存量的其他对象。

一些使用示例:

int var;
char arr[10];
t_myobject obj;

obj.mystery = &var;
obj.mystery = arr;
obj.mystery = malloc(100);

答案 1 :(得分:1)

您的struct声明void *,而您的问题是void。 void指针成员是指向任何类型数据的指针,根据运行时已知的条件将其转换为正确的指针类型。

void成员是"不完整类型"错误。

答案 2 :(得分:1)

错误的问题标题。该成员无效*'而不是'无效'。 指向任何东西的指针,而不是任何东西。

答案 3 :(得分:1)

void *类型的变量可以保存任何符号的地址。可以直接对此变量进行赋值,但在解除引用时需要将其类型转换为实际类型。这需要通知编译器在解除引用时需要访问多少内存字节。数据类型是告诉变量大小的类型。

int a = 10;
char b = 'c';
void *c = NULL;
c = &a;
printf("int is %d\n", *((int*)c));
c = &b;
printf("char is %c\n", *(char*)c));

在上面的示例中,void指针变量c首先存储int变量a的地址。因此,在解除引用void指针c时,它的类型为int *。这会通知编译器访问4字节(int的大小)以获取值。然后在第二个printf中将其术语转换为char *,这是为了通知编译器访问一个字节(char的大小)来获取值。