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 *被公认并被用作原始内存的无类型指针).
sizeof(void)认为我很清楚这不是1导致问题的原因.void,但这是C,这些事情都会发生.看来这个问题引起了很大的混乱.现在的问题不是关于为什么有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允许两者作为一种奇怪的语言扩展.
| 归档时间: |
|
| 查看次数: |
8868 次 |
| 最近记录: |