gpt4 book ai didi

c++ - void_ptr++ 不起作用,但 void_ptr+= 起作用

转载 作者:太空狗 更新时间:2023-10-29 20:42:17 25 4
gpt4 key购买 nike

我一直认为,指针自增/自减是这样的操作:

 new_ptr=old_ptr+sizeof(type)*count 

所以对于 int * 它将是:

  old_ptr=0     //int *ptr=0
count=1 //int count=1
new_ptr=old_ptr+sizeof(int)*count = 0+4*1 = 0x0004 //ptr+=count;

并且 void 的大小 = 0,因此使用 += 递增 void_ptr 不应改变它。但我可能错了。另一件事是++ 运算符,它会抛出错误。那么,如果++ 抛出错误,为什么 += 也不会抛出错误呢?示例代码:

#include <stdio.h>
void tell(const char *s,int *i,void *v){
printf("%s: \n int_ptr: %#x\n void_ptr: %#x\n",s,i,v);
}
int main(){
int *int_ptr=0;
void *void_ptr=0;
tell("Before",int_ptr,void_ptr);
int_ptr++; //int_ptr=int_ptr+sizeof(int); = 0x 0004
//void_ptr++; //error: ISO C++ forbids incrementing a pointer of type 'void*'
tell("After ++",int_ptr,void_ptr);
int_ptr+=1; //int_ptr=int_ptr+sizeof(int) = 0x0008
void_ptr+=1;//void_ptr=void_ptr+sizeof(void) WHY DOES THIS WORK AND ++ DOES NOT?! = 0x0001 ?! should be 0x0000, because sizeof void = 0
tell("After +=",int_ptr,void_ptr); //RESULT: void_ptr=0x1, so does that mean, that sizeof void is 1 and it is not 0
return 0;
}

输出:

Before:
int_ptr: 0
void_ptr: 0
After ++:
int_ptr: 0x4
void_ptr: 0
After +=:
int_ptr: 0x8
void_ptr: 0x1

有人能给我解释一下吗?

最佳答案

在 C 和 C++ 中,对 void 指针的运算都是非法的。一些编译器具有允许它的扩展。

在这种情况下,GCC 有一个 pointer arithmetic允许对 void 指针和函数指针进行算术运算的扩展,根据标准,这两者都是非法的。它将两者都视为指向大小为 1 的类型。

基本上,这是一种您应该在新代码中避免的兼容性问题。

为什么++ 运算符会抛出错误,而 += 不会,我不确定。++ 用于使用此扩展在 GCC 中工作。也许是这个版本的 GCC 中的错误,或者是对 C++ 的扩展应用不一致。

关于c++ - void_ptr++ 不起作用,但 void_ptr+= 起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19183434/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com