当前位置: 首页 > 知识库问答 >
问题:

C/C 空引用取消引用 [重复]

伏默
2023-03-14

由于解引用< code > NULL ptr (< code > NULL )在< code>C和< code>C 中都是未定义的行为,我想知道表达式< code >

如果也是未定义行为,那么链接答案中的OFFSETOF宏是如何工作的?

我一直认为< code>ptr-

我认为我的问题的答案在C和C中是相似的。

共有2个答案

鲍建业
2023-03-14
匿名用户

如果它也是未定义的行为,那么offsetof如何工作?

首选使用标准offsetof宏。自制版本会导致编译器警告。此外:

< code>offsetof需要按照上面的指定工作,即使是一元< code >运算符

offsetofgcc中的内置函数。

凤凡
2023-03-14

太长别读

C标准没有说空指针的间接本身具有UB。当前的标准草案,[expr.unary.op]

>

  • 一元*运算符执行间接:应用它的表达式应该是指向对象类型的指针,或者是指向函数类型的指针,结果是引用表达式指向的对象或函数的左值。如果表达式的类型是“指向T”的指针,则结果的类型是“T”。[片段]

    一元的结果

    除非将间接表达式的左值转换为右值,否则没有 UB。

    C标准要明确得多C11标准草案§6.5.3.2

  •  类似资料:
    • 本文向大家介绍C语言取消引用指针,包括了C语言取消引用指针的使用技巧和注意事项,需要的朋友参考一下 示例 要取消引用a_pointer并更改a的值,我们使用以下操作 可以使用以下打印语句对此进行验证。 但是,将一个NULL指针取消引用或其他无效指针将是错误的。这个 通常是未定义的行为。p1可能不会被取消引用,因为它指向的地址0xbad可能不是有效地址。谁知道那里有什么?它可能是操作系统内存,或另一

    • 引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。 C++ 引用 vs 指针 引用很容易与指针混淆,它们之间有三个主要的不同: 不存在空引用。引用必须连接到一块合法的内存。 一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。 引用必须在创建时被初始化。指针可以在任何时间被初始化

    • C++ 函数 向函数传递参数的引用调用方法,把引用的地址复制给形式参数。在函数内,该引用用于访问调用中要用到的实际参数。这意味着,修改形式参数会影响实际参数。 按引用传递值,参数引用被传递给函数,就像传递其他值给函数一样。因此相应地,在下面的函数 swap() 中,您需要声明函数参数为引用类型,该函数用于交换参数所指向的两个整数变量的值。 // 函数定义 void swap(int &x, in

    • 嗨我有以下方法: 不得不提的是,startDate和endDate是长变量。我尝试在if条件中添加null检查,也尝试使用longValue()方法,但没有结果。你知道我怎样才能解决这个问题吗?可能是fndBugs端的bug?

    • 本文向大家介绍C++中的循环引用,包括了C++中的循环引用的使用技巧和注意事项,需要的朋友参考一下 虽然C++11引入了智能指针的,但是开发人员在与内存的斗争问题上并没有解放,如果我门实用不当仍然有内存泄漏问题,其中智能指针的循环引用缺陷是最大的问题。 我们可以看到在出main函数作用域之前两个指针指向的内存并没有释放(指针指向的对象没有调用析构函数),我门把当前的引用数打印出来为2这个没有问题,

    • 我在这里看到了一个如何使用比较器界面对 ArrayList 进行排序的示例,所以我尝试了一下。对于Strsing,它可以完美地工作,但是对于一个我想排序为整数的变量,它不会编译,说“int不能被取消引用”。 我能做什么才能使它工作并允许我按分数变量对ArrayList进行排序? 这是我的代码: