c 中结构体的 void* 成员意味着什么?

问题描述 投票:0回答:4

我不明白下面的

mystery
成员是什么样的财产:

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

这个

void *
会员是什么样的会员?这占用了多少内存?我在哪里可以获得有关其实现的更多信息(例如,为什么要使用
void *
成员?)

c struct void-pointers
4个回答
5
投票

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

字段

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

一些使用示例:

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

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

2
投票

您的

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

A

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


2
投票

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
的大小)来获取值。


1
投票

问题标题错误。该成员是“void *”,而不是“void”。 一个指向任何东西的指针,而不是什么都没有。

© www.soinside.com 2019 - 2024. All rights reserved.