#include<stdio.h>
int main()
{int a;int *p = &a;void *z = p;char *c = z;
}
上面的代码编译并不一定会有报错和告警信息,但有些是需要注意的。
分析:
-
int a;
:定义了一个整型变量a。 -
int *p = &a;
:定义了一个指向整型变量的指针p,指向变量a的地址。 -
void *z = p;
:定义了一个void类型的指针z,并将指针p的值(即a的地址)赋给z。这也是合法的,因为void指针可以接受任意类型的指针值。 -
char *c = z;
:这一行是关键。在这里,你将void指针z的值(即a的地址)赋给了char类型的指针c。在C语言中,将void指针赋给其他类型的指针(如char *、int *等)是不安全的,因为它们可能有不同的大小和语义。
在实际应用中,通常不会直接将void *类型的指针赋值给char *类型的指针,除非确保在后续操作中不会导致类型错误或者访问越界。
比较推荐的做法为:将一个void *类型的指针赋值给具体类型(如int *、char *)的指针时,进行