取消引用无效指针

Sau*_*ade 21 c pointers

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

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

printf("\nlVptr[60 ] is  %d \n",lVptr[1]);
Run Code Online (Sandbox Code Playgroud)

Dav*_*son 24

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

int x = *(int*)lVptr;
Run Code Online (Sandbox Code Playgroud)

  • 要操作内存,您必须使用像“+”这样的运算符,这些运算符的行为取决于两边的整数类型。或者甚至只是为了读取一些内存,您需要指定一个类型,以便编译器知道要读取多少字节。如果您想要自由形式访问内存,请将指针转换为 `uint8_t *`。 (2认同)

tep*_*pic 22

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

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

如果你想将它视为一个数组(一个),你可以做一个有点丑陋((int *)lVptr)[0].使用[1]是出界的,因此不是一个好主意(至于lVptr[60]...)


小智 7

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

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

printf("\nlVptr[60 ] is  %d \n",*(int *)lVptr);
Run Code Online (Sandbox Code Playgroud)


Ed *_* S. 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
Run Code Online (Sandbox Code Playgroud)

注意,投一个int*也是不必要的,出于同样的原因,你不必(也应该)投的返回值malloc在C.

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

int *p = some_void_ptr;
Run Code Online (Sandbox Code Playgroud)

还有这个:

lVptr[1]
Run Code Online (Sandbox Code Playgroud)

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