如何在C中初始化数组,例如
void initArr(int size)
{
...
}
C语言没有提供初始化数组的选项 如果他的大小不是一个恒定值,如果我初始化 它通常(int * arr;)所以它给我错误'arr'不是 被初始化。
类似地,当我有一个带维度的数组时,我怎么能这样做呢 大于一(例如矩阵)?
答案 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
未评估的许多程序员的期望它的论点。