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

返回未初始化的、最终未使用的结构是未定义的行为吗?

劳烨
2023-03-14
typedef struct { int x; } s;

s callee(void) {
  s ret;
  return ret;
}

void caller() {
  s dummy = callee();
}

共有1个答案

冯沛
2023-03-14

首先考虑这段类似的代码:

s ret;
s dummy = ret;

结构不能有陷阱表示(C11 6.2.6.1/6)。但是这段代码由于Itanium子句(C11 6.3.2.1/2)导致了未定义的行为,该子句指出,使用未初始化的自动对象(其地址从未被占用)的值会导致UB。

因此这段代码应该是定义良好的:

s ret;
&ret;
s dummy = ret;
 类似资料:
  • 如果我有: 很明显,这个表达式后面的应该是零,但我看到的任何地方,他们都说这个代码的行为是未定义的,而不仅仅是的值(直到减法之前)。 很明显,编译器可以简单地在变量中使用它认为“方便”的任何垃圾值,并且它将按照预期工作。这种方法有什么问题?

  • 使用可以用register定义的自动未初始化变量,因为rvalue是未定义的行为。可以使用寄存器存储类说明符定义结构。 6.3.2.1 请注意,它特别指出,并且没有对它执行任何赋值。 我的说法正确吗?

  • 问题内容: 我正在使用AngularJS 1.4.0和服务。以下代码将始终打印出一个空对象: 我试过了: 使用AngulerJS 1.3.15,并且在刷新浏览器时cookie不会持久存在(但至少会创建cookie)。 添加有效期。 确保在我的浏览器(Chrome)中启用了Cookie。 尝试使用普通的旧JS,但仍然无法正常工作。 我在任何地方都找不到类似的问题。 谢谢。 问题答案: 对于偶然发现此

  • 读取值时未定义行为的一个明显示例是:

  • 我有以下Java代码: 但是,当我运行它时,它会抛出以下错误: 我在do之前初始化了变量。while 循环,并在 try. 中设置值。捕获循环。似乎尚未设置该变量。抱歉,如果这是一个相当基本的问题,但我似乎无法弄清楚。

  • 有人能解释一下为什么以下两个示例中的第一个编译,而第二个不编译?请注意,唯一的区别是第一个显式限定了对x的引用。这个,而第二个没有。在这两种情况下,在初始化之前显然尝试使用最终字段x。 我本以为这两个样本会被完全平等地对待,从而导致两者都出现编译错误。 1) 2)