我不明白下面的
mystery
成员是什么样的财产:
typedef struct _myobject
{
long number;
void *mystery;
} t_myobject;
这个
void *
会员是什么样的会员?这占用了多少内存?我在哪里可以获得有关其实现的更多信息(例如,为什么要使用 void *
成员?)
void*
变量是指向内存中地址的“通用”指针。
字段
mystery
本身会消耗内存中的 sizeof(void*)
字节,通常为 4 或 8 个字节,具体取决于您的系统(更准确地说,取决于虚拟内存地址空间的大小)。但是,它可能指向消耗不同内存量的其他对象。
一些使用示例:
int var;
char arr[10];
t_myobject obj;
obj.mystery = &var;
obj.mystery = arr;
obj.mystery = malloc(100);
您的
struct
声明为 void *
,您的问题为 void
。 void 指针成员是指向任何类型数据的指针,根据运行时已知的条件将其转换为正确的指针类型。
A
void
成员是“不完整类型”错误。
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
的大小)来获取值。
问题标题错误。该成员是“void *”,而不是“void”。 一个指向任何东西的指针,而不是什么都没有。