如何在 C 中初始化一个数组,例如
void initArr(int size)
{
...
}
如果他的大小不是一个常量值,并且如果我一般初始化它(int *arr;),C 语言不会提供初始化数组的选项,所以它会给我“arr”未初始化的错误。
同样,当我有一个维度大于一的数组(例如矩阵)时,我该怎么做?
如何在 C 中初始化一个数组,例如
void initArr(int size)
{
...
}
如果他的大小不是一个常量值,并且如果我一般初始化它(int *arr;),C 语言不会提供初始化数组的选项,所以它会给我“arr”未初始化的错误。
同样,当我有一个维度大于一的数组(例如矩阵)时,我该怎么做?
在 C 和 C++ 中有效的答案是动态内存分配
int *arr = (int*)malloc(size*sizeof(int));
在 C++ 中,您更愿意使用 new 而不是 malloc,但原理是相同的。
int* arr = new int[size];
如果数组的大小不是常量值,C 语言不提供初始化数组的选项
在 C99 中,您可以使用可变长度数组,然后使用循环对其进行初始化。
如果我一般初始化它(int *arr;)所以它给我错误'arr'没有被初始化。
这是因为在程序中使用指针之前必须对其进行初始化(指向指针对象 - 不包括 NULL)。
在 C 中,您可以使用 将对象初始化为 0 memset
。不能用于memset
将字符数组以外的对象可移植地初始化为重复的非零值。
在 C++ 中也是如此,但仅限于所谓的“POD”对象(Plain Old Data),它们与 C 中的对象基本相同(没有虚拟函数,没有私有数据成员等 - - 准确的定义在标准中)。这不是好的 C++ 风格,但它是可能的。
memset
在 C 和 C++ 中,您可以通过将维度和单个数据元素的大小相乘来找到以字节为单位的数组的总大小(您需要传递给)。例如:
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
不评估其参数的程序员的期望。