取消引用无效指针

时间:2013-03-18 01:27:51

标签: c pointers

即使在转换了void指针之后,我在解除引用时也遇到了编译错误。 谁能告诉我原因呢。

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

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

7 个答案:

答案 0 :(得分:21)

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

int x = *(int*)lVptr;

答案 1 :(得分:18)

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

这会将void指针强制转换为指向int的指针,然后将其正确解除引用。

如果你想将它视为一个数组(一个),你可以做一个稍微丑陋的((int *)lVptr)[0]。使用[1]超出范围,因此不是一个好主意(对于lVptr[60] ...)

答案 2 :(得分:4)

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

答案 3 :(得分:2)

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

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

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

答案 4 :(得分:0)

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

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

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

答案 5 :(得分:0)

您可能尝试做的示例:

#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

答案 6 :(得分:-1)

@ 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工具无法解析具有该限制的文件导致错误。我做了大量的脑力激荡,最终陷入了愚蠢的境地。

SAURABH