将指向任何类型的指针强制转换为用于算术的char指针是否安全且可移植? 考虑下面的代码段,对于C语言和C++语言,分别是: int t[2] = { 0, 1 }; *( (int *)( (char *)t + sizeof(int) ) ) = 2;

将指向任何类型的指针强制转换为用于算术的char指针是否安全且可移植? 考虑下面的代码段,对于C语言和C++语言,分别是: int t[2] = { 0, 1 }; *( (int *)( (char *)t + sizeof(int) ) ) = 2;,c++,arrays,c,pointers,pointer-arithmetic,C++,Arrays,C,Pointers,Pointer Arithmetic,始终相当于: int t[2] = { 0, 1 }; t[1] = 2; ? 这听起来可能很奇怪,但我想象了一些在某些平台上可能是错误的原因: char指针增量的方式可能与int指针相反,除非未经标准授权(在这种情况下,我想找出标准中的规定) 从int*到char*的转换可能是不安全的,因为不能保证它们的大小相同(在这种情况下,它可以与中间转换一起工作到void*?),并且因为标准不能保证转换到char*然后指向任何类型的指针是安全的 将指向任何类型的指针强制转换为用于算术的char指针

始终相当于:

int t[2] = { 0, 1 };
t[1] = 2;
?

这听起来可能很奇怪,但我想象了一些在某些平台上可能是错误的原因:

  • char
    指针增量的方式可能与
    int
    指针相反,除非未经标准授权(在这种情况下,我想找出标准中的规定)

  • int*
    char*
    的转换可能是不安全的,因为不能保证它们的大小相同(在这种情况下,它可以与中间转换一起工作到
    void*
    ?),并且因为标准不能保证转换到
    char*
    然后指向任何类型的指针是安全的

  • 将指向任何类型的指针强制转换为用于算术的char指针是否安全且可移植

    任何类型-->否

    (非空)强制转换到
    char*
    的函数指针是UB,然后应用的数学是UB


    Acth> Cal**/Cuth>甚至可能太小,不能对函数指针进行编码。

    C和C++是不同的语言。特别是C++对指针运算和对象生存期有更严格的规定,所以两种语言的答案可能不同。您应该指定您实际询问的语言。@FlashMcQueen是。如果这是不允许的,那不是因为不同类型的数组以不同的方向增长。请选择一种语言。这个问题很有趣,但如果你把两者都包括进去,问题就变得有点宽泛了languages@FlashMcQueen“我渴望在这种情况下学习两种语言”可能是真的,但现在你需要一个科目,除了两种语言。这样,你就更有可能得到2种语言的OK答案,而不是1种专家级别的答案。如果第一个问题不满足,最好发布第二个问题。你无法实现
    memcpy
    malloc
    ,等等。如果指针算法根据类型朝不同方向运行,那么这些问题都可以与空指针一起工作。对于任何对象类型,可能添加“是”?@EugeneSh。也许是对象类型,但OP提出了一个关于任何类型和两种语言的广泛问题。OP没有提供总体目标,所以对于一般问题,一般答案。@chux-Hmmm,一组任意函数指针是否是严格符合C代码的有效数组?还是只有完全相同类型的函数指针?@AndrewHenle在“任意函数指针数组”中,数组元素的地址是指向函数指针的指针,因此我们回到对象指针数学。注意-函数指针的大小都相同,但可能与某些/所有对象指针不同。