我不明白mystery
成员在下面是什么类型的财产:
typedef struct _myobject
{
long number;
void *mystery;
} t_myobject;
这位void
会员是什么类型的会员?这需要多少内存?我在哪里可以获得有关完成内容的更多信息(例如,为什么会使用void
成员?)
编辑 - 更新标题,说无效*
答案 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
的大小)来获取值。