使c中的指针无效

rbpvctlc  于 2022-12-26  发布在  其他
关注(0)|答案(3)|浏览(155)

我编写了这几行代码,希望它们能正常工作,但我一直收到一个错误,说“无效使用void表达式”,我不知道为什么

int main(){
   int a=12;
   void* ptr = &a;
   printf("%d",*ptr);
}

我认为void指针可以指向任何类型的数据,那么这里有什么问题呢?我甚至尝试将void指针转换为整型指针,但仍然得到相同的错误。

bmvo0sr5

bmvo0sr51#

我认为void指针可以指向任何类型的数据,那么这里有什么问题呢?
一个void *可以指向任何类型的data1。但是它只记住地址,而不是类型。要在*中使用它,你必须告诉编译器使用什么类型:

int a = 12;
void *ptr = &a;
printf("%d\n", * (int *) ptr);  // Use cast to specify type.

在执行过程中,程序不会记住ptr是从int分配的地址,并且会自动知道在printf调用中加载int。在编译过程中,编译器也不会记住这一点。要使用指针访问数据,必须将其转换回适当的类型,然后使用该类型。

脚注

1指针应该保留它所指向的任何对象的所有限定符。指向const int xvolatile int x的指针应该分别赋给const void *pvolatile void *p,而不是没有限定符的void *p

3ks5zfa0

3ks5zfa02#

无法取消引用void指针,基础类型(void)不完整。您应该为指针使用其他类型(如int*),或者应该将void指针强制转换为完整类型(同样,可能是int*)。

yks3o0rb

yks3o0rb3#

正如您所看到的,您不能解引用void*,但是将其强制转换为int*肯定是有效的:

printf("%d",*(int*)ptr);
    • 一个

相关问题