即使在转换了一个 void 指针之后,我在取消引用它时也会遇到编译错误。谁能告诉我这个的原因。
int lVNum = 2;
void *lVptr;
lVptr = (int*)&lVNum;
printf("\nlVptr[60 ] is %d \n",lVptr[1]);
取消引用 void 指针是没有意义的。编译器将如何解释指针指向的内存?您需要先将指针转换为正确的类型:
int x = *(int*)lVptr;
printf("\nlVptr[60 ] is %d \n", *(int*)lVptr);
这会将 void 指针转换为指向 an 的指针int
,然后正确取消引用它。
如果你想把它当作一个数组(一个),你可以做一个稍微难看的((int *)lVptr)[0]
. 使用[1]
超出范围,因此不是一个好主意(至于lVptr[60]
...)
它仍然是void*
,因为这就是您声明的内容。任何指针都可能被隐式转换为 a void*
,因此 cast 什么都不做,而你只剩下一个指针,void
就像你一开始一样。
您需要将其声明为int*
.
void *some_ptr = /* whatever */;
int *p = (int*)some_ptr;
// now you have a pointer to int cast from a pointer to void
请注意,转换为anint*
也是不必要的,出于同样的原因,您不必(也不应该)malloc
转换C 中的返回值。
void*
's 可以隐式转换为任何其他指针类型或从任何其他指针类型转换。我在这里添加演员表只是为了清楚起见,在您的代码中您只需编写;
int *p = some_void_ptr;
另外,这个:
lVptr[1]
是错的。您有一个指向单个int
而不是两个的指针。该取消引用会导致未定义的行为。
您不能取消引用void指针,因为它没有类型,首先您需要转换它(int *)lVptr
,然后取消引用它*(int *)lVptr
。
int lVNum = 2;
void *lVptr;
lVptr = &lVNum;
printf("\nlVptr[60 ] is %d \n",*(int *)lVptr);
一个 void 指针就是这样,一个指向 void 的指针(没有什么可定义的)。
在某些情况下很有用。例如 malloc() 准确地返回一个 void 指针,因为它为未定义的目的分配了内存。一些函数可能同样将 void 指针作为参数,因为它们不关心位置以外的实际内容。
老实说,您发布的片段完全没有意义,甚至无法猜测您要做什么。
您可能正在尝试执行的操作示例:
#include <stdio.h>
int main () {
void *v;
unsigned long int *i = (unsigned long int *)v;
*i = 5933016743776703571;
size_t j = sizeof(i);
printf("There are %ld bytes in v\n", j);
size_t k;
for (k = 0; k < j; k++) {
printf("Byte %ld of v: %c\n", k, ((char *)v)[k]);
}
}
输出:
There are 8 bytes in v
Byte 0 of v: S
Byte 1 of v: T
Byte 2 of v: A
Byte 3 of v: C
Byte 4 of v: K
Byte 5 of v: O
Byte 6 of v: V
Byte 7 of v: R
@ Code-Guru 我尝试在 Visual Studio 中编译它。它给出了错误 - 表达式必须是指向完整对象的指针。
谢谢 teppic,正如您所建议的,以下编译并产生正确的结果。
#include<stdio.h>
void main(){
printf("study void pointers \n");
int lvnum = 2;
void *lvptr;
lvptr = &lvnum;
printf("\n lvptr is %d\n",((int *)lvptr)[0]);
}
但是,如果我尝试 printf("\n lvptr is %d\n",((int *)lVptr)[60]); 它编译并运行,但给出随机数。
非常感谢各位朋友的建议。抱歉,我将一个 void 指针分配给了不必要的强制转换的 int 指针,并希望它被取消引用。但是,当我想取消引用它时,我应该使用它。
片段的目的:在我的消息来源中,我发现了由类似情况引起的 klocwork 错误。相反,该程序不仅编译,而且给出了正确的结果。原因 - 这是一个低级代码(无操作系统),其中分配给 void 指针的内存已经保留到 60 左右。但是 klocwork 工具无法解析具有该限制的文件,从而导致错误。我做了很多头脑风暴,结果很愚蠢。
索拉布