大 VLA 溢出

2023-11-30

根据某人在另一个线程中的评论:

VLA 带来的问题比它们解决的问题还要多,因为你永远不知道 如果声明会因为 x 太大而崩溃 堆。

这段代码会溢出,因为sizeof(a)对于堆栈来说太长:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int n = 100000000;
    int a[4][n];

    printf("%zu\n", sizeof(a));

    return 0;
}

但这一个不能因为sizeof(a)是 8(我电脑中指针的大小):

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int n = 100000000;
    int (*a)[n];

    printf("%zu\n", sizeof(a));
    a = malloc(sizeof(*a) * 4);
    free(a);
    return 0;
}

我的假设正确吗?

我们能否根据以下情况确定 VLA 的使用是否危险(可能溢出):sizeof物体?


int (*a)[n];不是VLA,而是指向VLA的指针。所以 OP 2 的例子还不够接近。


As @M.M评论说,防止堆栈溢出是任何自动分配的一个问题。递归可能会过度消耗堆栈。局部大变量也会过度消耗堆栈。

VLA 只是最有可能被过度使用的一种。

// Qualified use of VLA
int len = snprintf(NULL, 0 "%d", some_int);
assert(len > 0);
char vla_good[len+1];
len = snprintf(vla_good, len+1, "%d", some_int);

// Unqualified
int x;
scanf("%d", &x);
char vla_bad[x];  // who knowns what x may be, did scanf() even work?

VLA 引入的问题比它们解决的问题还要多,因为您永远不知道声明是否会因为 x 对于堆栈来说太大而崩溃。

我们能否确定使用 VLA 是否危险?

使用正确的工具来完成任务。通常,最坏情况下的小型固定大小数组就可以了。 VLA 的用途有限。健壮的代码将确保在声明 VLA 之前数组元素计数不是愚蠢的。

请注意,自 C99 起可用的 VLA 在 C11 中也可选择支持。

VLA 还不错,他们是就这样画的.

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

大 VLA 溢出 的相关文章

  • 如何在 VC++ CString 中验证有效的整数和浮点数

    有人可以告诉我一种有效的方法来验证 CString 对象中存在的数字是有效整数还是浮点数吗 Use tcstol http msdn microsoft com en us library w4z2wdyc aspx and tcstod
  • 传递 constexpr 对象

    我决定给予新的C 14的定义constexpr旋转并充分利用它 我决定编写一个小的编译时字符串解析器 然而 我正在努力保持我的对象constexpr将其传递给函数时 考虑以下代码 include
  • extern 声明和函数定义都在同一文件中

    我只是浏览了一下gcc源文件 在gcc c 我发现了类似的东西 extern int main int char int main int argc char argv 现在我的疑问是extern是告诉编译器特定的函数不在这个文件中 但可以
  • 如何将 .txt 文件中的数据转换为 xml? C#

    我在一个文本文件中有数千行数据 我想通过将其转换为更容易搜索的内容来轻松搜索 我希望 XML 或其他类型的大型数据结构 尽管我不确定它是否是最好的对于我的想法 每行的数据如下所示 第 31 册 托马斯 乔治 32 34 154 每本书都不是
  • 在 C# 中,如何根据在 gridview 行中单击的按钮引用特定产品记录

    我有一个显示产品网格视图的页面 该表内有一列 其中有一个名为 详细信息 的超链接 我想这样做 以便如果用户单击该特定产品的详细信息单元格 将打开一个新页面 提供有关该产品的更多信息 我不确定如何确定哪个Product记录链接的详细信息以及我
  • 不同 C++ 文件中的相同类名

    如果两个 C 文件具有相同名称的类的不同定义 那么当它们被编译和链接时 即使没有警告也会抛出一些东西 例如 a cc class Student public std string foo return A void foo a Stude
  • 在 C# 中检查 PowerShell 执行策略的最佳方法是什么?

    当你跑步时Get ExecutionPolicy在 PowerShell 中 它得到有效的执行政策 https learn microsoft com en us powershell module microsoft powershell
  • 在 VS 中运行时如何查看 C# 控制台程序的输出?

    我刚刚编写了一个名为 helloworld 的聪明程序 它是一个 C NET 4 5 控制台应用程序 在扭曲的嵌套逻辑迷宫深处 使用了 Console WriteLine 当我在命令行运行它时 它会运行并且我会看到输出 我可以执行其他命令并
  • 如果输入被重定向则执行操作

    我想知道如果我的输入被重定向 我应该如何在 C 程序中执行操作 例如 假设我有已编译的程序 prog 并且我将输入 input txt 重定向到它 我这样做 prog lt input txt 我如何在代码中检测到这一点 一般来说 您无法判
  • C++ - 多维数组

    处理多维数组时 是否可以为数组分配两种不同的变量类型 例如你有数组int example i j 有可能吗i and j是两种完全不同的变量类型 例如 int 和 string 听起来您正在寻找 std vector
  • 将二变量 std::function 转换为单变量 std::function

    我有一个函数 它获取两个值 x 和 y 并返回结果 std function lt double double double gt mult double x double y return x y 现在我想得到一个常量 y 的单变量函数
  • 将 Word 转换为 PDF - 禁用“保存”对话框

    我有一个用 C 编写的 Word 到 PDF 转换器 除了一件事之外 它工作得很好 有时 在某些 Word 文件上 后台会出现一条消息保存源文件中的更改 gt 是 否 取消 但我没有对源文件进行任何更改 我只想从 Word 文件创建 PDF
  • 如何最好地以编程方式将 `__attribute__ ((unused))` 应用于这些自动生成的对象?

    In my makefile我有以下目标 它将文本 HTML 资源 编译 为unsigned char数组使用xxd i http linuxcommand org man pages xxd1 html 我将结果包装在匿名命名空间和标头保
  • C++ 对象用 new 创建,用 free() 销毁;这有多糟糕?

    我正在修改一个相对较大的 C 程序 不幸的是 并不总是清楚我之前的人使用的是 C 还是 C 语法 这是在一所大学的电气工程系 我们 EE 总是想用 C 来做所有事情 不幸的是 在这种情况下 人们实际上可以逃脱惩罚 但是 如果有人创建一个对象
  • 模板类中的无效数据类型生成编译时错误?

    我正在使用 C 创建一个字符串类 我希望该类仅接受数据类型 char 和 wchar t 并且我希望编译器在编译时使用 error 捕获任何无效数据类型 我不喜欢使用assert 我怎样才能做到这一点 您可以使用静态断言 促进提供一个 ht
  • 将 Lambda 表达式树与 IEnumerable 结合使用

    我一直在尝试了解有关使用 Lamba 表达式树的更多信息 因此我创建了一个简单的示例 这是代码 如果作为 C 程序粘贴到 LINQPad 中 它可以工作 void Main IEnumerable
  • WPF DataGrid / ListView 绑定到数组 mvvm

    我们假设你有 N 个整数的数组 表示行数的整数值 在模型中 该整数绑定到视图中的 ComboBox Q1 如何将数组 或数组的各个项目 绑定到 DataGrid 或 ListView 控件 以便 当您更改 ComboBox 值时 只有那么多
  • 在 Win32 控制台应用程序中设置光标位置

    如何在 Win32 控制台应用程序中设置光标位置 最好 我想避免制作句柄并使用 Windows 控制台功能 我花了整个早上沿着那条黑暗的小巷跑 它产生的问题比它解决的问题还要多 我似乎记得当我在大学时使用 stdio 做这件事相对简单 但我
  • EntityFramework 6.0.0.0 读取数据,但不插入

    我创建了一个基于服务的数据库 folderName gt Add New Item gt Data gt Service based Database文件到 WPF 应用程序中 然后我用过Database First方法并创建了Person
  • 在 System.Type 上使用条件断点时出错

    这是函数 public void Init System Type Type this Type Type BuildFieldAttributes BuildDataColumns FieldAttributes 我在第一行设置了一个断点

随机推荐

  • 根据下一行的格式删除换行符

    我有一个这种格式的特殊文件 title1 1 texthere title2 2 texthere 我希望将所有以 开头的换行符放置为之前行的第二列 我尝试使用 sed 和以下命令来做到这一点 sed s n g filename 但它没有
  • 使用 log4net 的 RichTextBoxAppender

    有没有办法使用 log4net 以编程方式创建 RichTextBox Appender 换句话说 没有 xml app config using System using System Windows Forms using System
  • 单击日历外部时,fullcalendar 触发事件单击

    我有一份活动日期清单 当我单击列表中的事件时 我想触发与单击日历相同的操作 我的事件点击函数 eventClick function calEvent jsEvent view openEvent calEvent 尝试这个 为您的事件分配
  • 在 Windows 中获取用户日期格式

    我的问题类似于this one 但是 我不想获取日期格式locale 而是由用户设置的 原因是我正在使用pywin32与 Outlook 通信的 api 特别是按日期过滤邮件 我必须将日期传递给应用程序的格式是用户设置的格式 否则它将无法工
  • MATLAB 类 getter 和 setter

    我有 Java 背景 我在 Matlab 中的类尤其是 getter 和 setter 方面遇到问题 收到一条消息说句柄和值类之间存在冲突我有点不知道该怎么做 所以任何缺乏更好的词的帮助都会有所帮助 classdef Person prop
  • MUI 自动完成 – 从 3 个字符开始过滤

    我有这样的 Autcomplete mui 组件 它可以对复选框列表进行过滤 带有选项的弹出窗口应始终保持打开状态 我需要做的是仅当用户输入超过 3 个字符时才触发过滤
  • 循环遍历maven中的特定资源文件生成源

    我使用 maven antrun plugin 从 thrift IDL 生成源代码 我有一个单独的项目 和 jar 来保存这些生成的源 并且这个插件不支持通配符替换 所以我不能说 thrift 我使用执行任务来生成源代码并将它们复制到 s
  • 使用 dplyr 填充缺失的序列值

    我有一个数据框 其中缺少 SNAP ID 值 我想根据之前的非缺失值 lag 的序列 用浮点值填充缺失值 如果可能的话 我真的很想仅使用 dplyr 来实现这一目标 假设 永远不会丢失数据 因为我根据数据集的最小和最大之间的缺失天数生成缺失
  • Android 模拟器复选框和单选按钮错误 - ui 上显示各种不正确的状态

    最近 我发现模拟器的显示单选按钮和复选框有奇怪的行为 它不是只有 2 种 UI 状态 更具体地说 它显示 4 种不同甚至更多 我想它们是冻结的动画状态 在布局检查器和新版本的 API 上 它看起来很正常 请看下面的图片 我在 Api 版本
  • python 中 time.sleep 的奇怪打印行为[重复]

    这个问题在这里已经有答案了 我试图通过在同一行上每秒打印一个点来创建一个类似进度的东西 比如 钓鱼 之类的 这是我用的 import time print Fishing end for i in range 5 time sleep 1
  • WPF 迭代数据网格

    使用 WPF C NET4 5 使用 Visual Studio 2012 ulti 旧的 winforms 代码 foreach DataGridViewRow paretoRow in ParetoGrid Rows if Conver
  • pygame 平台游戏 - 如何使底部坚固?

    所以我正在制作一个 pygame 平台游戏 但我被困在一件事上 我找不到一种方法来使我的平台底部变得坚固 玩家可以降落在其顶部 但当它试图穿过底部时 它会弹回下方 我尝试了这个但没有成功 hits pg sprite spritecolli
  • 通过C#反射获取类内Enum的类型

    我有一个像这样的枚举 namespace EnumTest public class Enumeration public Enumeration public enum Days day sunday night monday 我怎样才能
  • MongoDB oplog有键名带点的记录,无法查询,afaict

    鉴于 Mongo 允许使用 点 设置嵌套字段 例如 rs0 PRIMARY gt db tmp update a 1 set b c 2 upsert true rs0 PRIMARY gt db tmp findOne id Object
  • jQuery 自动完成@mention

    我有 Andrew Whitaker 的这个自动完成插件 DEMO假设我有一个字符串textarea 欢迎 peterwaterber 我希望它在隐藏标签中输出为 彼得沃特伯 欢迎 我该怎么办 我不太擅长Javascript 我尝试过查看这
  • 隐式移动与复制操作和遏制

    当类有一个未定义移动操作的成员时 我很难理解隐式移动操作 int main struct A no move move copy A default A const A cout lt lt A copy ctor n A operator
  • Pandas DF 上的 Cumsum,负累积值重置为零

    我在 Pandas DF 中有一个时间顺序分组表 我正在尝试在组内创建一个运行总和 条件是运行总和不能为负数 即当运行总和变为负数时 列单元格值重置为零 并继续运行总和计算以保持完整性和数据质量 我已将 cumsum 与 groupby 函
  • ubuntu:所有 Android 模拟器(x86 和 arm)都卡在“连接到套接字‘127.0.0.1:1970’时出错:111 -> 连接被拒绝”

    我已经尝试了所有的 Android 模拟器 但它们都停留在以下步骤 emulator Error while connecting to socket 127 0 0 1 1970 111 gt Connection refused emu
  • 合并多个数组的行数据

    我有两个数组 如下所示 我需要合并数组的内容 以便最终得到第三个数组所示的结构 我已经检查了 array merge 但无法弄清楚这是可能的方式 任何帮助表示赞赏 谢谢 gross value gt 100 quantity gt 1 gr
  • 大 VLA 溢出

    根据某人在另一个线程中的评论 VLA 带来的问题比它们解决的问题还要多 因为你永远不知道 如果声明会因为 x 太大而崩溃 堆 这段代码会溢出 因为sizeof a 对于堆栈来说太长 include