void时指针算法的大小未知

Mat*_*ner 2 c gcc void-pointers pointer-arithmetic visual-studio

在Visual Studio C++版本9(也可能是其他版本)中,以下代码:

int a = sizeof(void);
void const *b = static_cast<void const *>("hello world");
b += 6;
Run Code Online (Sandbox Code Playgroud)

生成这些 错误:

error C2070: 'void': illegal sizeof operand
error C2036: 'const void *' : unknown size
Run Code Online (Sandbox Code Playgroud)

此代码在GCC下工作,GCC sizeof(void)视为1.

是否存在一些解决此限制的方法,因为char *为了指针运算的目的而明确地进行转换会增加混淆(void *被公认并被用作原始内存的无类型指针).

Update0

  • 请注意,我很清楚标准的存在.
  • 想做原始指针算术.
  • sizeof(void)认为我很清楚这不是1导致问题的原因.
  • 代码示例仅用于演示生成错误所需的内容.
  • 我知道这不是一种"正常"的使用方式void,但这是C,这些事情都会发生.
  • 是的,人们需要在低级别这样做.我不是在追求原因,我是在追求如何.如果你想知道原因,请查看一些内核源代码或友好的glibc.

UPDATE1

看来这个问题引起了很大的混乱.现在的问题不是关于为什么sizeof(void) == 1不标准,但做什么时,它不是.

在要进行单字节指针运算的情况下,事实证明,转换为char *正确的答案,不是因为*(void *)没有大小,而是因为标准实际上保证了这*(char *)一点1.因此,为了原始指针算法的目的,使用char *始终是正确的,并且void *与GCC扩展一致.

为了进一步强调这一点,void *对于指向无类型内存的指针是正确的选择,并且char *为原始指针算法强制转换的正确类型.

Mat*_*del 18

从技术上讲,增加一个指针可以通过它所指向的任何大小来增加它.无效点无所谓,因此大小未知.

对于某些编译器来说,这是一个让你增加void指针的精确性.

转换很烦人,因为你必须将它转换为另一个指针,然后返回,或做一些尴尬的事情 (*(char *)&voidptr) += 6

就个人而言,我只是将其声明为char *算术目的


AnT*_*AnT 10

在C语言sizeof中不能应用于不完整类型.void是一个不完整的类型,这就是为什么你不能用它作为操作数的原因sizeof.

void *C中也不支持指针的指针运算.为了与指针运算一起使用,指针必须指向对象类型,而void不是.

GCC允许两者作为一种奇怪的语言扩展.


Dre*_*ann 6

void * 意在暗示"指向未知"

因此,未定义向void指针添加6,因为您要求编译器将指针前进"6个未知对象的大小".

你不应该这样做.