未提及的结构体字段是否*总是*初始化为零(即当结构体位于堆栈上时)?

2023-12-11

根据实验(在 Clang 和 GCC 中,使用 -O2 和 -O0)是seems在下面的代码中

typedef struct foo_s { int i; int j; } foo_t;
int main(void) {
    foo_t foo = {.i = 42};
    ...

foo.j 自动为零。

是由 C99 开始保证的,还是编译器特定的实现细节?

注意:我什至尝试将 0xFF 写入堆栈下方的无效内存,即稍后给出的 foo 的地址。

更新:有一些评论指出,这只是因为堆栈下方的内存恰好包含零。以下代码可确保情况并非如此,并且可以证明 GCC -O0 正在将内存清零。

-7 和 -6 的偏移量取决于编译器。他们需要在 Clang 中有所不同。

typedef struct foo_s { int i; int j; } foo_t;

int main(void) {
    int r;
    int *badstack0 = &r - 7;
    int *badstack1 = &r - 6;

    *badstack0 = 0xFF; // write to invalid ram, below stack
    printf("badstack0 %p, val: %2X\n", badstack0, *badstack0);
    *badstack1 = 0xEE; // write to invalid ram, below stack
    printf("badstack1 %p, val: %2X\n", badstack1, *badstack1);

    // struct test
    foo_t foo = {.i = 42};
    printf("&foo.i %p\n", &foo.i);
    printf("&foo.j %p\n", &foo.j);
    printf("struct test: i:%i j:%i\n", foo.i, foo.j);
    return 0;
}

Output:

badstack0 0x7fff221e2e80, val: FF
badstack1 0x7fff221e2e84, val: EE
&foo.i 0x7fff221e2e80
&foo.j 0x7fff221e2e84
struct test: i:42 j:0

如果您提供任何初始化程序,则未明确提及的成员将被初始化,就像它们是静态的一样。 6.7.9 (19) 中的标准保证了这一点:

初始化应按初始值设定项列表顺序进行,为特定子对象提供的每个初始值设定项将覆盖同一子对象的任何先前列出的初始值设定项;所有未显式初始化的子对象应与具有静态存储持续时间的对象一样隐式初始化.

(重点是我加的)

如果不初始化任何成员,则所有成员的值都是不确定的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

未提及的结构体字段是否*总是*初始化为零(即当结构体位于堆栈上时)? 的相关文章

  • C# 打印问题(RichTextBox)

    我想打印我的 RichTextBox eintragRichTextBox 的内容 我现在有这个代码 private void druckenPictureBox Click object sender EventArgs e PrintD
  • json.net自定义jobject反序列化

    我正在尝试使用 JsonConvert DeserializeObject string 将字符串反序列化为可与动态一起使用的 jobject 来动态访问 json 文档 但是我想避免知道文档的大小写 以便我可以输入 dynamic doc
  • 在路由mvc 4中添加公司名称

    我一直在尝试为 Facebook 等用户提供在 URL 中添加公司名称的选项 http localhost 50753 MyCompany Login 我尝试过不同的网址 但没有成功 routes MapRoute name Default
  • 一次分配多个字段的聪明方法?

    由于遗留函数调用 我有时被迫编写像这样的丑陋的包装器 function return someWrapper someField a someField a b someField b and so on realistically it
  • C++ 长 switch 语句还是用地图查找?

    在我的 C 应用程序中 我有一些值充当代表其他值的代码 为了翻译代码 我一直在争论使用 switch 语句还是 stl 映射 开关看起来像这样 int code int value switch code case 1 value 10 b
  • linq 中使用字符串数组 c# 的 'orderby'

    假设我有一个这样的方法定义 public CustomerOrderData GetCustomerOrderData string CustomerIDs var query from a in db Customer join b in
  • 如何使用 SOAP 且不使用 WSE 在 .NET 中签署 Amazon Web 服务请求

    亚马逊产品广告 API 以前称为 Amazon Associates Web Service 或 Amazon AWS 实施了一项新规则 即自 2009 年 8 月 15 日起 向其发送的所有 Web 服务请求都必须经过签名 他们在其网站上
  • 是否存在指向不同类型的指针具有不同大小的平台?

    C 标准允许指向不同类型的指针具有不同的大小 例如sizeof char sizeof int 是允许的 但是 它确实要求如果将指针转换为void 然后转换回其原始类型 它必须与其原始值进行比较 因此 从逻辑上来说 sizeof void
  • 检测到堆栈崩溃

    我正在执行我的 a out 文件 执行后 程序运行一段时间 然后退出并显示消息 stack smashing detected a out terminated Backtrace lib tls i686 cmov libc so 6 f
  • 在开关中使用“goto”?

    我看到了一个建议的编码标准 内容如下Never use goto unless in a switch statement fall through 我不跟 这个 例外 案例到底是什么样的 这证明了goto 此构造在 C 中是非法的 swi
  • 获取 boost Spirit 语法中的当前行

    我正在尝试使用 boostspirit 获取正在解析的文件的当前行 我创建了一个语法类和结构来解析我的命令 我还想跟踪在哪一行找到命令并将其解析到我的结构中 我将 istream 文件迭代器包装在 multi pass 迭代器中 然后将其包
  • 访问 ascx 文件中的母版页控件

    我有一个母版页文件 其中包含 2 个面板控件中的 2 个菜单 我还使用控件来检查用户是否登录并获取用户类型 根据我想要显示 隐藏面板的类型 控件本身不在母版页中引用 而是通过 CMS 系统动态引用 我想在用户控件中使用findcontrol
  • 使用查询表达式对 List 进行排序

    我在使用 Linq 订购这样的结构时遇到问题 public class Person public int ID get set public List
  • 增强精神、递归和堆栈溢出

    为什么下面的代码在运行时崩溃 它会给出堆栈溢出错误 include
  • 根据对象变量搜索对象列表

    我有一个对象列表 这些对象具有三个变量 ID 名称和值 这个列表中可能有很多对象 我需要根据ID或Name找到一个对象 并更改值 例子 class objec public string Name public int UID public
  • 从浏览器访问本地文件?

    您好 我想从浏览器访问系统的本地文件 由于涉及大量安全检查 是否可以通过某种方式实现这一目标 或使用 ActiveX 或 Java Applet 的任何其他工作环境 请帮帮我 要通过浏览器访问本地文件 您可以使用签名的 Java Apple
  • ASP.NET MVC 路由:如何从 URL 中省略“索引”

    我有一个名为 StuffController 的控制器 具有无参数索引操作 我希望从表单中的 URL 调用此操作mysite com stuff 我的控制器定义为 public class StuffController BaseContr
  • .NET 4 的条件编译[重复]

    这个问题在这里已经有答案了 可能的重复 条件编译和框架目标 https stackoverflow com questions 2923210 c sharp conditional compilation and framework ta
  • 通过 Tab 键浏览 XML 文档字段

    In VB NET you can move through the fields in the XML member documentation with the Tab key 这在 C 中不起作用 还有其他方法吗 除了用鼠标将光标放在
  • 为什么匹配模板类上的部分类模板特化与没有模板匹配的另一个部分特化不明确?

    这个问题可能很难用标题中的句子来描述 但这里有一个最小的例子 include

随机推荐

  • h5py 将虚拟数据集读取到 NumPy 数组时出错

    我正在尝试从使用 h5py 创建的虚拟 HDF 数据集加载数据 但在正确加载数据时遇到一些问题 这是我的问题的一个例子 import h5py import tools as ut virtual h5py File ut params p
  • C# 泛型方法和动态类型问题[重复]

    这个问题在这里已经有答案了 我有一个通用方法声明如下 public void Duplicate
  • SurfaceView 和 ImageView 的区别

    我想知道SurfaceView和ImageView有什么区别以及它们的使用场景 两者似乎都是一样的 如果有我可能错过的正确链接 请指导我 表面视图的一些优点和差异 更好的渲染机制 线程可以在不使用处理程序的情况下更新表面的内容 这有助于提高
  • Angular 中的子父母沟通最佳实践

    我正在努力提高 Angular 的水平 并且想了解儿童与家长之间沟通的最佳实践 我当前想要使用的应用程序是 Angular 6 我知道我可以使用 ViewChild Output 或创建服务在子父组件之间进行通信 还有其他方式进行沟通吗 如
  • 无法让OkHttp的response.body.toString()返回字符串

    我正在尝试使用 OkHttp 获取一些 json 数据 但当我尝试记录时无法弄清楚为什么response body toString 我得到的是Results com squareup okhttp Call RealResponseBod
  • 在最新的 MapBox SDK 6.7 中旋转和更改标记的位置

    Mapbox Android SDK 6 7 0 我们正在开发的应用程序的要求是 我们必须在不同的 LatLng 位置添加多个标记 并使用一些方位旋转它们 在旧的mapbox版本 4 2 1 中 我们可以毫无问题地做到这一点 Working
  • 如何在可编码类型中使用 Any

    我目前正在与Codable输入我的项目并面临问题 struct Person Codable var id Any id上面的代码可以是String or an Int 这就是原因id属于类型Any 我知道Any is not Codabl
  • 在 ActionScript 3 中加密/解密图像

    我正在开发一个移动应用程序 其中包含 本质上 图片消息功能 我需要使用简单的纯文本密码对图像进行加密 解密 由于所捕获图像的性质 加密和解密过程在设备上进行是 至关重要的 在听完有关 Flex 移动开发的演示后 我决定使用 Flex SDK
  • 为什么查询不会因子查询中不存在的列而失败?

    我在查询中拼写错误 并遇到了 MySQL 的奇怪行为 create table aaa id bigint auto increment primary key amount int not null other column varcha
  • sklearn 绘制带有标签的混淆矩阵

    我想绘制一个混淆矩阵来可视化分类器的性能 但它仅显示标签的数量 而不显示标签本身 from sklearn metrics import confusion matrix import pylab as pl y test business
  • 是否有可能并且以良好的形式在 Angular 中重用相同的数据工厂?

    我正在查看 Angular 的 CRUD 通用工厂 我目前更喜欢使用它而不是使用服务 app factory dataFactory http function http var urlBase odata ContentTypes The
  • Vue 3 外部组件/插件在运行时加载

    我正在设计一个架构Vue 3具有基于分布式模块所有权的应用程序 模块系统将用插件来表示 似乎是最合适的解决方案 允许vuex模块和vue router动态注入 每个此类模块 插件都将由在独立存储库中工作的专门团队开发 我们不能使用npm每个
  • 重定向 stdin 和 stdout,其中 stdin 首先关闭

    这实际上与我已经回答的另一个问题有关 这个问题在这里 将一个进程对象的标准输出重定向到另一个进程对象的标准输入 我的问题是 我认为 获取输入的程序应该在程序输出之前退出 这是与我正在做的事情等效的 bash tccat i dev sr0
  • 如何让 jqGrid 重新加载到服务器?

    我们使用网格上的 jqGrid 导航器重新加载按钮loadonce设置为 true 重新加载按钮目前不会返回服务器获取数据 我们如何才能让重新加载去服务器获取最新数据 我相信我们可以使用beforeRefresh设置网格的回调data to
  • 任务“:app:validateSigningDebug”执行失败。 java.util.concurrent.ExecutionException:

    我刚刚创建了一个新的 flutter 应用程序 当我尝试在模拟器上运行它时 会出现以下错误消息 在调试模式下在为 x86 构建的 Android SDK 上启动 lib main dart 运行 Gradle 任务 assembleDebu
  • Angular:如何监视 $element.on

    我有一个指令 它在其中做了类似的事情link功能 angular module myApp directive barFoo function return restrict E link function scope element el
  • 这个异步任务方法有什么问题?

    这只是一个简单的异步任务 但我总是遇到奇怪的编译器错误 此代码来自 ASP NET 4 项目中的 Web API 服务 使用 VS2010 创建 即使ContinueWith 非泛型 隐式返回Task 但此错误仍然存 在 Code publ
  • Console.WriteLine 与 Print

    我知道这听起来像是一个非常愚蠢的问题 但我很困惑 只能找到 WriteLine vs debug log 问题的答案 而不是这个问题 我最初开始使用 Visual Studio 在那里我学会了使用 Console WriteLine exa
  • Spring、Hibernate 事务。加入 A 中创建的线程 B 中的事务。可能吗?

    是否可以在另一个线程中使用事务 就像传递交易一样创建于thread A然后执行一些逻辑Thread B在同一笔交易中 我有两个队列和单独的执行器 用于处理某些实体类型的数量 然而 批处理作业是管理两个人口并等待每个完成 这将是不必要创建两个
  • 未提及的结构体字段是否*总是*初始化为零(即当结构体位于堆栈上时)?

    根据实验 在 Clang 和 GCC 中 使用 O2 和 O0 是seems在下面的代码中 typedef struct foo s int i int j foo t int main void foo t foo i 42 foo j