32

即使在转换了一个 void 指针之后,我在取消引用它时也会遇到编译错误。谁能告诉我这个的原因。

int lVNum = 2;
void *lVptr;
lVptr = (int*)&lVNum;

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

7 回答 7

37

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

int x = *(int*)lVptr;
于 2013-03-18T01:30:38.643 回答
30

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

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

如果你想把它当作一个数组(一个),你可以做一个稍微难看的((int *)lVptr)[0]. 使用[1]超出范围,因此不是一个好主意(至于lVptr[60]...)

于 2013-03-18T01:32:51.257 回答
5

它仍然是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而不是两个的指针。该取消引用会导致未定义的行为。

于 2013-03-18T01:30:16.533 回答
4

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

int lVNum = 2;
void *lVptr;
lVptr = &lVNum;

printf("\nlVptr[60 ] is  %d \n",*(int *)lVptr);
于 2014-08-27T15:23:36.380 回答
1

一个 void 指针就是这样,一个指向 void 的指针(没有什么可定义的)。

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

老实说,您发布的片段完全没有意义,甚至无法猜测您要做什么。

于 2013-03-18T03:36:43.040 回答
1

您可能正在尝试执行的操作示例:

#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
于 2013-03-18T05:34:26.027 回答
0

@ 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 工具无法解析具有该限制的文件,从而导致错误。我做了很多头脑风暴,结果很愚蠢。

索拉布

于 2013-03-19T05:01:15.460 回答