C 取消引用无效指针

C 取消引用无效指针,c,pointers,C,Pointers,即使在抛出一个空指针之后,我在取消引用它时也会遇到编译错误。 谁能告诉我原因吗 int lVNum = 2; void *lVptr; lVptr = (int*)&lVNum; printf("\nlVptr[60 ] is %d \n",lVptr[1]); 它仍然是一个void*,因为这就是您所声明的。任何指针都可以隐式转换为void*,这样cast就不会执行任何操作,只剩下一个指向void的指针,就像您开始时一样 您需要将其声明为int* void *some_ptr =

即使在抛出一个空指针之后,我在取消引用它时也会遇到编译错误。 谁能告诉我原因吗

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

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

它仍然是一个
void*
,因为这就是您所声明的。任何指针都可以隐式转换为
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
请注意,对
int*
的强制转换也是不必要的,因为同样的原因,您不必(也不应该)在C中强制转换
malloc
的返回值

void*
可以隐式转换为任何其他指针类型,也可以从任何其他指针类型转换。我在这里添加cast只是为了清晰,在代码中您只需编写

int *p = some_void_ptr;

此外,这:

lVptr[1]

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

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

int x = *(int*)lVptr;
printf(“\nlVptr[60]是%d\n”,*(int*)lVptr)

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


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

一个空指针就是指向空的指针(没有定义)

在某些情况下很有用。 例如,malloc()返回一个空指针,因为它为未定义的目的分配了内存。 有些函数同样可以将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]);
    }
}
@代码大师 我试图在VisualStudio中编译它。它给出错误-表达式必须是指向完整对象的指针

谢谢你, 正如您所建议的,下面的编译将产生正确的结果

#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]);


}
#包括
void main(){
printf(“研究无效指针”);
int lvnum=2;
无效*lvptr;
lvptr=&lvnum;
printf(“\n lvptr是%d\n”,((int*)lvptr)[0]);
}
但是,如果我尝试printf(“\n lvptr是%d\n”,((int*)lvptr)[60]); 它编译并运行,但给出随机数

非常感谢朋友们的建议。很抱歉,我为不必要的强制转换int指针分配了一个空指针,并期望它被取消引用。然而,当我想取消引用它时,我应该铸造它

片段的目的: 在我的资料中,我发现了由类似情况引起的klocwork错误。相反,程序不仅编译了,而且给出了正确的结果。原因-这是一个低级别代码(无操作系统),其中分配给空指针的内存已保留到类似60的计数。但是klocwork工具无法解析具有该限制的文件,从而导致错误。我做了很多脑筋急转弯,最后做了一些愚蠢的事情


Saurabh

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

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

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

不能取消对空指针的引用。实际的编译错误是什么?在四行代码中,我们有(a)不必要的强制转换,(b)非法取消对非类型指针的引用,以及(c)越界的未定义行为。这可能是一条新记录。您会遇到哪些编译器错误?如果没有实际的错误本身,很难告诉您错误的原因。@Code Guru:一般来说,是的。在这里,没有那么多。您希望
lVptr[1]
返回什么?+1在这里只剩下cast,在C中不需要它。除此之外,这就解决了所有问题。@WhozCraig:是的,我只是希望它尽可能清晰。我想我应该提一下;它可能会防止将来进行愚蠢的
malloc
强制转换。为什么编译器必须关心解释内存?这不取决于我操纵内存的操作吗?要操纵内存,必须使用
+
之类的运算符,这些运算符的行为取决于两边的整数类型。甚至只是为了读取一些内存,您需要指定一个类型,以便编译器知道要读取多少字节。如果希望以自由形式访问内存,请将指针投射到
uint8\u t*