ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-09-19 11:05:27  阅读:232  来源: 互联网

标签:c language-lawyer undefined-behavior pointers


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

在关于我之前的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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有