以下代码中的void *是做什么的?

时间:2012-08-20 13:34:18

标签: c pointers

  

可能重复:
  Setting void * pointer equal to an integer

我之前的问题已经结束,也许我没有明确说明,我可以再问一次吗?

我有一个指针:

void * p;
p = malloc(sizeof(int));

然后有一个int:

int age = 20;
p = (void*)age;

我的问题是p = (void*)age;是如何运作的?如果p是指针,那么(void *)在age前面起作用了什么?为什么价值p是20?

4 个答案:

答案 0 :(得分:3)

您正在创建一个名为age的自动变量,您还要创建一个名为p的变量,它是一个void *指针。这意味着它是一个指向某事物的指针,但你不知道是什么。然后,您将age的值分配给指针p。为了满足类型系统,您必须使用void *语法将其强制转换为(void *),以便向编译器说“我知道我在做什么。”。

至于你在void *指针中存储整数的原因......我没有理由想到。也许你的意思是p = &age,这意味着p指向堆栈上的变量。

回答ratzip的评论:

`(void *)age`

表示“void *指针,其值为age”。

如果我写了void *p = malloc(1)那么它会分配一些内存,而p的数值将是内存中的地址,例如12345。如果我在内存中找到该值,我会找到我分配的内存。如果我写(void *)age,那么我正在进行投射(即将值放在一种类型中并以不同的类型存储)并将其分配给p。因此p的值为20,p指向“地址20处的内存”。除非你知道 那里有一些你想要使用的内存,否则这是没有意义的。我可以肯定地说99.999%确实不是这种情况。 intpointer都是数字,但它们用于非常不同的目的。一个代表用户的号码,一个代表计算机的内存地址。

(当然,对于虚拟化内存,上述情况并非严格属实)

答案 1 :(得分:1)

强制转换使编译器假设您知道自己在做什么,并发出将age中的整数值转换为地址的代码。这通常不是很难,因为无论如何地址都只是整数值。

当然,使用20作为地址很少是明智的,因此如果指针被解除引用,此代码可能会导致崩溃。

文本(void *)是括在括号中的类型名称,在C中称为“强制转换”,它用于将其后面的表达式类型转换为命名类型。通常,看到涉及void *的演员表应该作为警告标志,因为在正确的代码中很少需要它们。

答案 2 :(得分:0)

(void *)是一个类型转换,它将整数值20转换为(void *)值20。

基本上,您将从malloc()返回的当前(void *)值设置为0x00000014。

如果您尝试将p设置为年龄整数的地址,则需要执行以下操作:

p = &age;

如果要填充p指向的内存(使用malloc分配),值为20,则需要执行以下操作:

*p = age;

答案 3 :(得分:0)

当您将指针强制转换为指针然后将其放入p时,显式指定p指向的地址20

通常,您不知道您使用的数据的显式地址,因此使用&运算符或某些内存管理工具(如{{{{}}}初始化程序中的指针,其中包含一些非显式地址。 1}}。

但是,这种用例在嵌入式系统领域非常普遍。通常,硬件有一组映射到地址空间的寄存器,下面的结构非常常见。所有这些地址都在HW文档中指定。

malloc