使用未知大小初始化C / C ++中的数组

时间:2013-10-13 13:42:37

标签: c arrays initialization

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

void initArr(int size)
{
  ...
}

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

类似地,当我有一个带维度的数组时,我怎么能这样做呢 大于一(例如矩阵)?

3 个答案:

答案 0 :(得分:10)

在C和C ++中有效的答案是动态内存分配

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

在C ++中,您更喜欢使用new而不是malloc,但原理是相同的。

int* arr = new int[size];

答案 1 :(得分:1)

  

如果数组的大小不是常量值,则C语言不提供初始化数组的选项

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

  

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

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

答案 2 :(得分:0)

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

在C ++中,情况也是如此,但它仅限于所谓的“POD”对象(普通旧数据),它们与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未评估的许多程序员的期望它的论点。