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

时间:2019-03-19 08:00:36

标签: c

由于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

4 个答案:

答案 0 :(得分:5)

根据上下文的不同,关键字void的使用可能确实具有不同的语义:

  • 这可能意味着什么,例如void myfunction(...) { ... }int my_other_function(void) {...}
  • 它可能表示任何内容,例如void *p = ...;

在C中,void指针是可以指向任何内容的指针。同样在C ++中,但是应尽可能避免使用,并且std::any应该是首选。

关于您的虚构实现的重要说明:void指针本身并不了解它所指向的对象的大小。

答案 1 :(得分:2)

void有多种用途;就这样。 voidvoid*是非常不同的野兽。请注意,void*不是关键字,而void是关键字。

不要认为void*是您的结构。它只是一个通过强制转换从另一种类型转换的指针。 malloc返回的void*可以通过某种机制转换为另一种指针类型,这种机制有些矛盾,使得无法在可移植C语言中编写malloc

答案 2 :(得分:1)

不,它们并非完全无关。 void是(C11 6.2.5p19

的类型
  

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

void *是一种指向该类型对象的指针类型。

只要指针正确对齐,任何对象指针类型都可以通过显式强制转换转换为另一种对象指针类型;不用C进行 转换就可以在指针类型之间进行的唯一转换是转换为void *并再次返回。因此void *状态为通用指针类型。

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

答案 3 :(得分:1)

void* ptr=malloc(10);在堆上创建10个字节的未初始化原始数据。该数据此时没有类型。

它不会“创建一个称为ptr的10字节的指针”。变量ptr的大小为sizeof(void*)个字节,无论您指向何处,都被分配为“自动存储”(可能在堆栈上)。

有关主流计算机上可能在何处分配不同变量的说明,请参见A program uses different regions of memory for static objects, automatic objects, and dynamically allocated objects