在 sizeof 操作中取消引用空指针是否有效[重复]

2023-11-26

我遇到了一段代码,对我来说应该崩溃分段故障,但它仍然可以顺利工作。有问题的代码加上相关的数据结构如下(相关注释位于上面):

typedef struct {
  double length;
  unsigned char nPlaced;
  unsigned char path[0];
}


RouteDefinition* Alloc_RouteDefinition()
{
  // NB: The +nBags*sizeof.. trick "expands" the path[0] array in RouteDefinition
  // to the path[nBags] array
  RouteDefinition *def = NULL;
  return (RouteDefinition*) malloc(sizeof(RouteDefinition) + nBags * sizeof(def->path[0]));
}

为什么这有效?我认为sizeof the char* 将解析为给定体系结构上指针的大小,但在取消引用 a 时它不应该崩溃并烧毁吗?NULL-指针?


为什么这有效?

这有效是因为sizeof是一个编译时构造,除了变长数组根本不评价。如果我们看一下C99标准草案部分6.5.3.4 运算符的大小段落2 says(强调我的):

[...] 大小由操作数的类型决定。结果是一个整数。如果操作数的类型是变长数组类型,则对操作数求值;否则,不计算操作数结果是一个整数常量。

我们还在段落中看到以下示例5这证实了这一点:

double *dp = alloc(sizeof *dp);
       ^^^                ^
                          |                                 
                          This is not the use of uninitialized pointer 

在编译时type确定表达式的值以便计算结果。我们可以通过以下示例进一步证明这一点:

int x = 0 ;
printf("%zu\n", sizeof( x++ ));

这不会增加x,这非常整洁。

Update

正如我在我的答案 to 为什么 sizeof(x++) 不增加 x?有一个例外sizeof是一个编译时操作,即它的操作数是一个可变长度数组(VLA)。虽然我之前没有指出引用自6.5.3.4上面确实说了这一点。

尽管在 C11 中而不是 C99 中,未指定是否sizeof在这种情况下是否被评估。

另外,请注意这个问题有一个 C++ 版本:不评估应用了 sizeof 的表达式是否可以合法地在 C++ 中取消引用 sizeof 内的 null 或无效指针?.

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

在 sizeof 操作中取消引用空指针是否有效[重复] 的相关文章

随机推荐

  • GameKit 无线网络连接?

    我读到 从 iPhone OS 3 1 开始 GameKit 支持 wifi 连接 但文档指出 如果您的应用程序配置了 对等选择器允许互联网 连接 您的应用程序必须 还解雇同行选择器和 提供自己的配置界面 互联网连接 这还成立吗 如果是这样
  • 为什么我的类型化数据集不喜欢临时表?

    我正在尝试将表适配器添加到 SQL Server 2005 Express 中的存储过程 然而 存储过程使用一个名为 temp 的临时表 创建表适配器时 Visual Studio 抱怨 未知对象 temp 并表示存储过程返回 0 列 这是
  • 如何静音“其类型使用匿名命名空间 [-Werror]”gcc 版本 4.8.2

    在我的项目的一个头文件中 以下行包含在inline method typedef boost archive iterators transform width
  • Codeigniter/PHP 会话安全问题

    我正在使用 Codeigniter 开发一个 Web 应用程序 当用户通过我的网站进行身份验证时 我当前将他们的 用户标识符 存储在我的会话 cookie 中 我已启用加密 我的几个模型类使用会话 cookie 的 用户标识符 参数中的值来
  • 如何放大矩形中绘制的填充样式? [关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 我正在使用 Net 绘图来绘制图表 它本质上是一个堆积条形图 我遇到的问题是 我想减少填充样式中的线条数量 以便在某种程度上放大它以使其更清晰 我环顾四周 但没有发现任何可以帮助我的东
  • 如何在 vtkStructuredGrid 上设置数据值

    我正在尝试用分析字段填充结构化网格 但是尽管阅读了 vtk 文档 我还没有找到如何在网格点实际设置标量值或设置网格的间距 原点信息 从下面的代码开始 我该如何 将空间信息与网格相关联 即单元格 0 0 0 位于坐标 0 0 0 每个方向的间
  • 使用selenium保存页面中的图像

    我正在使用 Selenium 和 Google Chrome 驱动程序以编程方式打开页面 每个页面上都有一个我想下载的动态生成的图像 目前 我正在等待页面完成加载 然后获取图像 URL 并使用 System Net WebClient 下载
  • 如何创建线程安全的ContentProvider?

    Android 文档说 可以从各种 ContentResolver 调用 ContentProvider 方法 不同进程和线程中的对象 必须实现它们 以线程安全的方式 我在 Stackoverflow 上找到了这篇文章Android sql
  • go float 零除编译器错误

    这种行为有何意义 只打印编译器警告而不是错误不是更有意义吗 func main var y float64 0 0 var x float64 4 0 y fmt Println x Inf func main var x float64
  • 如何仅更改 javafx css 中的左填充

    我经常使用 html css 但我对 javafx css 完全陌生 所以这将是一个新手问题 但我在任何地方都找不到答案 我有一个充满标签的大网格窗格 除了其他标签之外 我可以为所有这些标签设置填充 例如 GridPane containe
  • C++ 中的越界和未定义的行为

    我知道在 C 中 超出缓冲区范围的访问是未定义的行为 这是来自 cppreference 的示例 int table 4 bool exists in table int v return true in one of the first
  • 两个字符相加产生 int

    我制作了一个简单的程序并使用 GCC 4 4 4 5 编译它 如下所示 int main char u 10 char x x char i u x return 0 g c Wconversion a cpp 我有以下内容 a cpp I
  • Jackson JSON - 反序列化 Commons MultiMap

    我想使用 JSON 序列化和反序列化 MultiMap Apache Commons 4 要测试的代码段 MultiMap
  • 非常量复制构造函数和返回值的隐式转换

    考虑以下 C 代码 struct B struct A A int A A missing const is intentional A B operator B A f return A 1 compiles fine return 1
  • 粘性灵活的页脚和页眉 CSS 在 WebKit 中工作正常,但在 Gecko 中不行

    我正在尝试构建一个允许灵活高度的页眉和页脚的布局 中间的部分占用剩余空间 中间的任何溢出都应该为该中间部分提供一个滚动条 我的适用于 Safari 和 Chrome 的代码是
  • Angular:构建后是否可以读取json文件

    我正在开发一个 Angular 7 项目 该项目需要在不同的服务器上运行 我需要从环境文件中读取服务器 URL 并且无法设置为静态变量 我尝试读取 JSON 文件 但一旦我ng build该项目 它将 JSON 的内容复制为 main js
  • MVC 中 OnChange 事件的 AJAX 调用

    我必须对作为视图一部分的下拉列表的 onchange 事件进行 AJAX 调用 在更改事件中 我需要调用数据库 进行一些计算以显示 UI 然后使用计算来填充图表控件 UI 显示按此顺序 图表 下拉类别列表 带有评分的子类别列表 因此 我需要
  • 使用 phpMyAdmin 的跟踪机制迁移数据库

    在开发数据库中 我在所有表上启用了 phpMyAdmin 跟踪 它记录了我对表结构所做的所有更改 在本例中我对数据跟踪不感兴趣 到目前为止一切顺利 然后我想要做的是为所有跟踪的表取出一份报告 其中包含特定版本 或者日期甚至可以工作 所做的更
  • django - django-taggit 形式

    我想用django taggit 点击这里 文档 点击这里 谈论使用ModelForm生成表单 但我已经有了我想使用的表单 假设我有这样的事情 forms py class MyForm forms Form tags forms Char
  • 在 sizeof 操作中取消引用空指针是否有效[重复]

    这个问题在这里已经有答案了 我遇到了一段代码 对我来说应该崩溃分段故障 但它仍然可以顺利工作 有问题的代码加上相关的数据结构如下 相关注释位于上面 typedef struct double length unsigned char nPl