使用 const int 定义数组的大小

2023-12-25

当我尝试运行它时,它给我一个错误,指出变量中的值a不是恒定的。这对我来说没有意义,因为我明确地创建了变量a持续的。数组的大小是否必须比这个更恒定?意思是,仅#define a 5,或将其初始化为int arr[5]或使用malloc?我的做法有什么问题吗?

int main{

   const int a = 5;
   int i;
   int arr [a];

   for (i = 0; i < 5; i++) {
      arr[i] = i * 2;
   }

  printf("%d", arr[1]);
  return 0;
}

In C, const应该读作只读。它没有定义编译时间。

const int a = 5;

Here a, is not所需的常量表达式C标准 http://port70.net/~nsz/c/c11/n1570.html#6.7.9p4:

6.7.9 初始化
4 具有静态或线程存储持续时间的对象的初始值设定项中的所有表达式都应为常量 表达式或字符串文字。

因此该错误表明您正在使用 C89/C90 编译器。您可以读取用户的输入a并声明一个变长数组 https://en.wikipedia.org/wiki/Variable-length_array,这是一个 C99 功能,具有自动存储期限。

Using #define是另一种方式。但它只是一个文本替换,并定义了一个具有自动存储持续时间的数组。与定义相同int arr[5];你自己。

如果你想在动态存储(通常称为“堆”)上分配内存,你必须使用malloc() http://man7.org/linux/man-pages/man3/malloc.3.html系列函数,在整个程序执行过程中都有生命周期,直到您调用free() on it.

(请注意,这种行为const仅在 C 中。C++ 在此方面有所不同,并且将按您的预期工作)。


如果我用 C89 编译代码,它会失败并显示:

#include <stdio.h>

int main(){

   const int a = 5;
   int i;
   int arr [a];

   for (i = 0; i < 5; i++) {
      arr[i] = i * 2;
   }

  printf("%d", arr[1]);
  return 0;
}

$ gcc -Wall -Wextra -std=c89 -pedantic-errors test.c
test.c: In function âmainâ:
test.c:7:4: error: ISO C90 forbids variable length array âarrâ [-Wvla]
    int arr [a];
    ^

因为 C89 不支持 VLA(尽管 gcc 支持它)一个扩展 https://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html即使在 C89/C90 中)。因此,如果您使用的编译器不支持 C99,则无法使用 VLA。 例如,Visual Studio 并不完全支持所有 C99 和 C11 功能。虽然,Visual Studio 2015 支持大多数 C99 功能 http://blogs.msdn.com/b/vcblog/archive/2014/06/18/crt-features-fixes-and-breaking-changes-in-visual-studio-14-ctp1.aspx、VLA 不是其中之一。

但同样的代码在 C99 和 C11 中编译没有任何问题:

$ gcc -Wall -Wextra -std=c99 -pedantic-errors t.c
$ gcc -Wall -Wextra -std=c11 -pedantic-errors t.c

这是因为C99中添加了可变长度数组(VLA)。请注意,VLA 在 C11 标准中已成为可选的。因此,实现可能不支持 C11 中的 VLA。 你需要测试__STDC_NO_VLA__检查您的实施是否不支持 VLA。

From 6.10.8.3 条件特征宏 http://port70.net/~nsz/c/c11/n1570.html#6.10.8.3

__STDC_NO_VLA__
整数常量1,旨在表明该实现不支持可变长度数组或可变长度数组 修改后的类型。

我个人不使用 VLA,因为如果数组大小相当大,则无法移植地发现分配失败。例如。

size_t size = 8*1024;
int arr[size];

在上面的片段中,如果arr分配失败,直到运行时你才会知道。内存分配取决于平台的“足够小”大小是多少。因此,在一台机器上,1MB 分配可能会成功,而另一台机器上可能会失败,更糟糕的是,没有办法捕获此失败。

因此,VLA 的使用受到限制,只能与您知道在给定平台上始终会成功的小型阵列一起使用。但我会简单地对数组大小进行硬编码并处理边界条件。

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

使用 const int 定义数组的大小 的相关文章

  • “构建”构建我的项目,“构建解决方案”则不构建

    我刚刚开始使用VS2010 我有一个较大的解决方案 已从 VS2008 成功迁移 我已将一个名为 Test 的控制台应用程序项目添加到解决方案中 选择构建 gt 构建解决方案不编译新项目 选择构建 gt 构建测试确实构建了项目 在失败的情况
  • 为什么 C# Array.BinarySearch 这么快?

    我已经实施了一个很简单用于在整数数组中查找整数的 C 中的 binarySearch 实现 二分查找 static int binarySearch int arr int i int low 0 high arr Length 1 mid
  • WCF RIA 服务 - 加载多个实体

    我正在寻找一种模式来解决以下问题 我认为这很常见 我正在使用 WCF RIA 服务在初始加载时将多个实体返回给客户端 我希望两个实体异步加载 以免锁定 UI 并且我想利用 RIA 服务来执行此操作 我的解决方案如下 似乎有效 这种方法会遇到
  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • 在结构中使用 typedef 枚举并避免类型混合警告

    我正在使用 C99 我的编译器是 IAR Embedded workbench 但我认为这个问题对于其他一些编译器也有效 我有一个 typedef 枚举 其中包含一些项目 并且我向该新类型的结构添加了一个元素 typedef enum fo
  • BitTorrent 追踪器宣布问题

    我花了一点业余时间编写 BitTorrent 客户端 主要是出于好奇 但部分是出于提高我的 C 技能的愿望 我一直在使用理论维基 http wiki theory org BitTorrentSpecification作为我的向导 我已经建
  • 如何从 appsettings.json 文件中的对象数组读取值

    我的 appsettings json 文件 StudentBirthdays Anne 01 11 2000 Peter 29 07 2001 Jane 15 10 2001 John Not Mentioned 我有一个单独的配置类 p
  • 不同枚举类型的范围和可转换性

    在什么条件下可以从一种枚举类型转换为另一种枚举类型 让我们考虑以下代码 include
  • 将多个表映射到实体框架中的单个实体类

    我正在开发一个旧数据库 该数据库有 2 个具有 1 1 关系的表 目前 我为每个定义的表定义了一种类型 1Test 1Result 我想将这些特定的表合并到一个类中 当前的类型如下所示 public class Result public
  • 如何在整个 ASP .NET MVC 应用程序中需要授权

    我创建的应用程序中 除了启用登录的操作之外的每个操作都应该超出未登录用户的限制 我应该添加 Authorize 每个班级标题前的注释 像这儿 namespace WebApplication2 Controllers Authorize p
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • 如何将带有 IP 地址的连接字符串放入 web.config 文件中?

    我们当前在 web config 文件中使用以下连接字符串 add name DBConnectionString connectionString Data Source ourServer Initial Catalog ourDB P
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • C# 成员变量继承

    我对 C 有点陌生 但我在编程方面有相当广泛的背景 我想做的事情 为游戏定义不同的 MapTiles 我已经像这样定义了 MapTile 基类 public class MapTile public Texture2D texture pu
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现
  • C++ 标准是否指定了编译器的 STL 实现细节?

    在写答案时this https stackoverflow com questions 30909296 can you put a pimpl class inside a vector我遇到了一个有趣的情况 这个问题演示了这样一种情况
  • 用于验证目的的动态查找方法

    我正在使用 Ruby on Rails 3 0 7 我想在运行时查找一些记录以进行验证 但为该查找方法传递 设置一个值 也就是说 在我的班级中 我有以下内容 class Group lt lt ActiveRecord Base valid

随机推荐

  • 如何从我的网站邀请 Facebook 的朋友 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • SQL Server 2008 R2(.Net 2.0 应用程序)中的死锁问题

    所讨论的 Sql Server 2008 R2 实例是一个重负载 OLTP 生产服务器 几天前出现了僵局问题 但仍未解决 我们收到了 Xml 死锁报告 其中列出了死锁涉及的存储过程以及其他一些详细信息 我将首先尝试列出此 xml 中的事实
  • iOS 开发者版本与发行版版本

    一段时间以来 我一直有这样的印象 对于 iOS 使用开发人员配置文件签署构建允许应用程序通过 XCode 构建在授权设备 在开发配置文件中列出 上运行 并进行调试 而使用分发配置文件签名允许应用程序在其他 iOS 设备上运行 但不能调试 这
  • 在 PhoneGap 1.2.0 中使用 Google Analytics 时 Android 和 iOS 之间的差异

    我一直在尝试让 Google Analytics 在 Android 和 iOS 上的 PhoneGap 1 2 0 中工作 在 PhoneGap 1 2 0 中使用 Google Analytics 时 Android 和 iOS 之间的
  • 使用 jquery ajax 在同一 POST 请求中上传文件和 JSON 数据?

    我正在尝试使用 jQuery Ajax 发送 POST 请求 我想在其中上传文件和一些 json 数据 请查找代码 var logoImg input name logoImg get 0 files 0 var formData new
  • Jinja2 中的独特列表过滤器

    我有以下 YAML 结构 bri cards slot 1 subslot 0 ports 2 slot 1 subslot 1 ports 2 slot 1 subslot 2 ports 2 slot 2 subslot 0 ports
  • 以编程方式关闭 netty

    我正在使用 netty 4 0 24 Final 我需要以编程方式启动 停止 netty 服务器 启动服务器时 线程被阻塞在 f channel closeFuture sync 请帮助提供一些如何正确执行的提示 下面是 Main 类调用的
  • 当 datagrid-cell 获得焦点时自动编辑 WPF datagrid 内容

    我在 WPF 中有一个数据网格数据网格文本列 and a 数据网格模板列
  • 直接在程序中打开图像

    我按照教程在 C windows 中制作了一个基本的图片查看器程序 该程序工作正常 但我想像默认的 Windows 照片查看器一样打开它 我尝试直接使用该程序打开图像 但打开程序后图像框是空的 当图像在程序内部浏览打开时 图像框工作正常 但
  • 如何查看 mongodb 正在执行的查询?

    我一直在我的 log development log 中看到这个 我想知道这个查询是否真的在我的数据库中执行 MONGODB 0ms socialcrunch development tags find id gt secrets limi
  • 测试redis密钥过期

    我想知道是否有人有一种聪明的方法来测试 redis 密钥过期后的行为 我本质上是为我的应用程序构建一个小型的 Redis 支持的缓存 并想测试 Redis 密钥设置过期后会发生什么 我使用 rspec 作为我的测试框架 我尝试在测试期间使用
  • 安卓过渡

    我使用以下代码为我的 SplashScreen 设置两个图像之间的动画 public void onCreate Bundle savedInstanceState super onCreate savedInstanceState set
  • 将 iPhone CoreData 文件从一个项目复制到另一个项目

    我正在尝试创建 2 个应用程序 一个构建持久存储 另一个使用它 到目前为止 我已经构建了一个应用程序 它使用 CoreData 从 XML 文件成功构建数据库 所以这个项目包含数据模型 实体的 h m 文件等 我现在尝试通过将数据模型文件
  • 如何计算双打的平均值,以使总误差最小?

    假设我们有一长串双打 比如说 N 1000000 array
  • OpenGL-ES 2.0 VS OpenGL-ES 1.1,哪个更快?

    我已经使用 OpenGL ES 1 1 编写了一个应用程序 但我想知道切换到 2 0 是否可以提高速度 有人用大多边形模型做过测试吗 我只想渲染具有不同颜色的三角形 没什么花哨的 然而 我想要渲染大约 100 万个三角形用于我的比较测试 O
  • 使用 ViewModel 在 MVC3 C# 中创建一个下拉列表,并在 POST 返回时轻松绑定模型。

    我有这个问题 我想为一周中的每一天制作 7 个下拉菜单 在每个下拉列表中 我希望添加相同的数据 我的视图模型 public class WeekDienstCreateViewModel public WeekDienst weekDien
  • Maven 有没有办法确保属性已设置

    我刚刚找到了一个由错误的属性值引起的困难 Maven 问题 该属性是测试运行时使用的备用 JVM 的路径 我想通过检测路径是否有效来使 Maven 尽早失败 实现这一目标的方法可能是什么 我打算深入研究antrun 看看是否有办法让它先运行
  • 如何使用 Enzyme 或 React 测试库在 React 中测试 Material-UI 的响应式 UI(例如隐藏、网格、断点)

    如何测试 Material UI 中的响应式元素 Example import React from react import Hidden from material ui core Hidden const HideOnMobile p
  • vim + COPY + mac 通过 SSH

    我通过 ssh 访问服务器 在该服务器上运行 vim 来编辑文件 当我尝试使用 y 或 y 将文本从 vim 拉入本地编辑器时 它不起作用 我最终得到的是我最后在本地复制的文本 如果我只在其中使用 p 它确实有效维姆 好吧 为了扩展雷的答案
  • 使用 const int 定义数组的大小

    当我尝试运行它时 它给我一个错误 指出变量中的值a不是恒定的 这对我来说没有意义 因为我明确地创建了变量a持续的 数组的大小是否必须比这个更恒定 意思是 仅 define a 5 或将其初始化为int arr 5 或使用malloc 我的做