【问题标题】:Initializing Arrays in C/C++ With Unknown Size [closed]在 C/C++ 中初始化大小未知的数组 [关闭]
【发布时间】:2013-10-13 13:42:36
【问题描述】:

如何在 C 中初始化一个数组,例如

void initArr(int size)
{
  ...
}

C 语言没有提供初始化数组的选项 如果他的大小不是一个常数值,如果我初始化 它通常(int *arr;)所以它给我的'arr'错误不是 正在初始化。

同样,当我有一个有维度的数组时,我该怎么做 大于一(例如矩阵)?

【问题讨论】:

  • C 语言(至少 C99 版本)确实为您提供了该选项。 C++ 没有。语言的选择在这里非常重要,所以选择一种。
  • 如果指定了“int size”,那么大小就不是未知的了吧?
  • 是 C 吗?还是 C++?不能两者兼有。
  • 我正在研究 C 语言
  • @Johnny 您要么需要查看 C 的 C99 方言中支持的可变长度数组。或者如果您没有可用的,您需要查看使用 malloc 的动态内存分配或类似的。这些都是大话题,因此不可能在论坛帖子中描述所有细节。

标签: c arrays initialization


【解决方案1】:

适用于 C 和 C++ 的答案是动态内存分配

int *arr = (int*)malloc(size*sizeof(int));

在 C++ 中你更喜欢使用 new 而不是 malloc,但原理是一样的。

int* arr = new int[size];

【讨论】:

  • 尽管在 C++ 中,您应该使用诸如 std::vector<int> 之类的容器而不是原始数组。您还应该使用 free(arr) (C) 或 delete[] arr (C++) 释放您分配的任何未使用的内存。
  • 正确答案,但请提及sizeof 用于“维度大于一的数组”。 (“初始化”——这不等同于“声明”,将内存归零会“初始化”它吗?)
【解决方案2】:

如果数组的大小不是一个常数值,C语言没有给出初始化数组的选项

在 C99 中,您可以使用可变长度数组,然后使用循环对其进行初始化。

如果我一般初始化它(int *arr;)所以它给我错误'arr'没有被初始化。

这是因为在程序中使用指针之前必须初始化(指向指针对象 - 不包括 NULL)。

【讨论】:

  • C99 确实 not 为您提供了初始化可变长度数组的选项。第6.7.9节(初始化)“3.要初始化的实体的类型应该是一个未知大小的数组或者一个完整的对象类型,不是变长数组类型。”
  • @rici;更新了我的答案。
【解决方案3】:

在 C 中,您可以使用 memset 将对象初始化为 0。不能使用memset 将字符数组以外的对象可移植地初始化为重复的非零值。

在 C++ 中也是如此,但仅限于所谓的“POD”对象(Plain Old Data),它们与 C 中的对象基本相同(没有虚函数,没有私有数据成员,等等——准确的定义在标准中)。这不是很好的 C++ 风格,但有可能。

在 C 和 C++ 中,您可以通过将维度和单个数据元素的大小相乘来找到以字节为单位的数组的总大小(您需要将其传递给 memset)。例如:

void InitializeMatrix(double *m, size_t rows, size_t cols) {
  memset(m, 0, rows * cols * sizeof *m);
}

在 C99 中,您可以声明可变长度数组 (VLA),即使是多维数组,如果这样做,您可以直接在数组上使用 sizeof 运算符,这样会方便很多。但是对 VLA 有很多限制;它们通常不会按照您期望的方式工作。但是,以下方法确实有效:

double m[rows][cols];
memset(m, 0, sizeof m);

请注意,在 C99 中,与传统 C 或 C++ 不同,在这种情况下编译的 sizeof 运算符实际上可能会创建运行时代码,因此违反了许多程序员的预期,即 sizeof 不会评估其参数。

【讨论】:

  • 简而言之,经过解释,我想我可以这样写:TYPE DIM_NUM arr = (TYPE DIM_NUM)malloc(SIZE * size(TYPE DIM_NUM-1));谢谢你们!!!你的回答真的很有帮助:)
猜你喜欢
  • 1970-01-01
  • 2014-10-27
  • 1970-01-01
  • 2013-10-20
  • 1970-01-01
  • 1970-01-01
  • 2023-04-11
  • 2023-02-23
  • 1970-01-01
相关资源
最近更新 更多