在内存分配期间"void*"指针声明和"void"关键字如何相关?



由于 C 指针返回一个"void*",除了它自己的地址之外,它可能会以某种方式引用 malloc(size) 保留的内存大小,我问自己"void*"的声明是否实际上与用于执行过程的类型"void"完全无关,如果"void*"实际上是一种自包含分配的内存块大小等信息的类型, 具有类似于下面显示的"内部"结构。

//An imaginary internal implementation of "type" void* used to create pointers
struct void*
{
char[4] address; //for 32bit systems;
int size; //memory block size;
};
void* ptr=malloc(10); //create a pointer called ptr of 10 bytes

关键字void的使用可能确实具有不同的语义,具体取决于上下文:

  • 它可以没有任何意义,例如在void myfunction(...) { ... }int my_other_function(void) {...}
  • 它可以意味着任何事物,例如在void *p = ...;

在 C 语言中,void 指针是可以指向任何事物的指针。 在C++也是如此,但应尽可能避免使用,std::any应首选。

关于你的假想实现的重要评论:一个 void 指针本身不知道它所指向的对象的大小。

void有多个用途;仅此而已。voidvoid*是非常不同的野兽。请注意,void*不是关键字,但void是关键字。

不要认为void*是你的结构。它只是一个指针,由强制转换从另一种类型转换而来。malloc返回一个可转换为另一种指针类型的void*,其机制有点矛盾地使得无法在可移植 C 中写入malloc

不,它们并非完全无关。void是一种类型 (C11 6.2.5p19)

包含一组空值;它是一个无法完成的不完整对象类型。

void *是指向所述类型的对象的指针类型。

任何对象指针类型都可以转换为具有显式强制转换的另一个对象指针类型,前提是指针已适当对齐;在 C 中,指针类型之间唯一可以在没有强制转换的情况下发生的转换是转换为void *并再次转换回来;因此void *状态为泛型指针类型。

void类型本身可用于其他任务 - 例如,表达式可以强制转换为void以指示该值被有意忽略,或者用作返回值类型以指示函数不返回值。唯一的语义重载是在原型中使用voidint func(void)表示函数不接受任何参数。

void* ptr=malloc(10);

堆上创建 10 个字节的原始未初始化数据。该数据此时没有类型。

不会"创建一个名为 ptr 的 10 字节指针"。变量ptrsizeof(void*)字节,并分配为"自动存储"(可能在堆栈上),无论您让它指向何处。

请参阅程序对静态对象、自动对象和动态分配的对象使用不同的内存区域,以解释主流计算机上可能分配不同变量的位置。

相关内容

最新更新