我之前的问题已经结束,也许我没有明确说明,我可以再问一次吗?
我有一个指针:
void * p;
p = malloc(sizeof(int));
然后有一个int:
int age = 20;
p = (void*)age;
我的问题是p = (void*)age;
是如何运作的?如果p是指针,那么(void *)在age
前面起作用了什么?为什么价值p
是20?
答案 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%确实不是这种情况。 int
和pointer
都是数字,但它们用于非常不同的目的。一个代表用户的号码,一个代表计算机的内存地址。
(当然,对于虚拟化内存,上述情况并非严格属实)
答案 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