其他分享
首页 > 其他分享> > c – 指针变量只是与某些运算符整数还是“符号”?

c – 指针变量只是与某些运算符整数还是“符号”?

作者:互联网

编辑:原始的单词选择令人困惑.术语“象征性”比原始术语(“神秘”)要好得多.

在关于我之前的C问题的讨论中,我被告知指针是

>“a simple value type much like an integer
>不是“mystical
>“The Bit pattern (object representation) contains the value (value representation) (§3.9/4) for trivially copyable types, which a pointer is.

这听起来不错!如果没有任何符号,并且指针是其表示,那么我可以执行以下操作.我可以吗?

#include <stdio.h>
#include <string.h>

int main() {
    int a[1] = { 0 }, *pa1 = &a[0] + 1, b = 1, *pb = &b;
    if (memcmp (&pa1, &pb, sizeof pa1) == 0) {
        printf ("pa1 == pb\n");
        *pa1 = 2;
    }
    else {
        printf ("pa1 != pb\n");
        pa1 = &a[0]; // ensure well defined behaviour in printf
    }
    printf ("b = %d *pa1 = %d\n", b, *pa1);
    return 0;
 }

这是一个C和C问题.

使用GNU GCC v4.8.3进行Compile and Execute C Online测试:gcc -O2 -Wall给出

pa1 == pb                                                                                                                                                                                       
b = 1 *pa1 = 2    

使用GNU GCC v4.8.3进行Compile and Execute C++ Online测试:g -O2-Wall

pa1 == pb                                                                                                                                                                                       
b = 1 *pa1 = 2        

因此,通过(& a)[1]的b修改在C和C中的GCC失败.

当然,我想根据标准报价给出答案.

编辑:为了回应关于UB on& a 1的批评,现在a是一个1元素的数组.

相关:Dereferencing an out of bound pointer that contains the address of an object (array of array)

补充说明:我认为,“神秘”一词最初是由Tony Delroy here使用的.我借用它是错误的.

解决方法:

C被认为是一种语言,其中指针和整数非常密切相关,确切的关系取决于目标平台.指针和整数之间的关系使得该语言非常适合于低级或系统编程.出于以下讨论的目的,我将这种语言称为“低级别C”[LLC].

C标准委员会编写了一种不同语言的描述,这种关系没有明确禁止,但没有以任何有用的方式得到承认,即使实现为目标和应用领域生成代码,这种关系也是有用的.我将这种语言称为“仅限高级别C”[HLOC].

在编写标准的时代,大多数自称C实现的事情都处理了LLC的方言.最有用的编译器处理一种方言,该方言在比HLOC更多的情况下定义了有用的语义,但没有LLC那么多.指针表现得更像整数还是更像抽象神秘实体,取决于使用哪种精确方言.如果正在进行系统编程,那么将C视为将指针和整数视为密切相关是合理的,因为适合于该目的的LLC方言是这样做的,而不这样做的HLOC方言不适用于该目的.然而,当进行高端数字运算时,人们更常使用HLOC的方言,这些方言不能识别这种关系.

真正的问题,以及如此争论的根源在于LLC和HLOC越来越不同,但两者都被称为C.

标签:c,language-lawyer,undefined-behavior,pointers
来源: https://codeday.me/bug/20190919/1812606.html