取消引用无效指针

即使在转换了一个void指针之后,我在解除引用时也遇到了编译错误。 有谁能请让我知道这个的原因。

int lVNum = 2; void *lVptr; lVptr = (int*)&lVNum; printf("\nlVptr[60 ] is %d \n",lVptr[1]); 

printf("\nlVptr[60 ] is %d \n", *(int*)lVptr);

这会将void指针强制转换为指向int的指针,然后正确地取消引用它。

如果你想把它当作一个数组(一个),你可以做一个稍微丑陋的((int *)lVptr)[0] 。 使用[1]是出界的,因此不是一个好主意(对于lVptr[60] ……)

取消引用void指针没有意义。 编译器如何解释指针指向的内存? 您需要先将指针强制转换为正确的类型:

 int x = *(int*)lVptr; 

它仍然是一个void*因为这就是你宣称的那样。 任何指针都可能被隐式转换为void* ,因此强制转换不做任何事情,并且你会在开始时留下指向void的指针。

您需要将其声明为int*

 void *some_ptr = /* whatever */; int *p = (int*)some_ptr; // now you have a pointer to int cast from a pointer to void 

注意, 转换int*也是不必要的,因为您不必(也不应该)在C中转换malloc的返回值。

void*可以隐式转换为任何其他指针类型。 为了清楚起见,我在这里添加了演员,在你的代码中你只需写;

 int *p = some_void_ptr; 

这个:

 lVptr[1] 

是错的。 你有一个指向单个int的指针,而不是两个指针。 该取消引用会导致未定义的行为。

你不能解除引用void指针,因为它没有类型,首先需要强制转换它然后取消引用*(int *)lVptr

 int lVNum = 2; void *lVptr; lVptr = &lVNum; printf("\nlVptr[60 ] is %d \n",*(int *)lVptr); 

void指针就是那个指向void的指针(无法定义)。

在某些情况下很有用。 例如,malloc()精确地返回一个void指针,因为它为UNDEFINED目的分配了内存。 某些函数同样可以将void指针作为参数,因为它们不关心除位置之外的实际内容。

说实话,你发布的片段绝对没有意义,甚至无法猜出你想要做什么。

您可能尝试做的示例:

 #include  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 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]); 它编译并运行,但给出随机数。

非常感谢,朋友们提出了所有的建议。 我向自己指定了一个无效指针,指向不必要的int指针,并期望它被解除引用。 但是,当我想要取消引用它时,我应该将它转换为它。

片段的目的:在我的来源中,我发现klocwork错误是由类似情况引起的。 相反,该计划不仅编制,而且给出了正确的结果。 原因 – 它是一个低级代码(无操作系统),其中分配给void指针的内存已经被保留,直到计数为60.但是klocwork工具无法解析具有该限制的文件导致错误。 我做了大量的脑力激荡,最终陷入了愚蠢的境地。

SAURABH