我试图初始化整个int
数组,在通过 Stackoverflow 搜索后,我发现最好的方法是使用std::fill_n
from<algorithm>
或<vector>
header,但同时包含两者会给出错误。我认为这些方法只能在 C++ 中使用,还是我做错了什么?
如何在没有任何循环的情况下使用 C 中的值初始化整个数组,即在单个语句中?
我正在开发 Fedora 14 终端并使用 gcc 进行编译。
如果你有你的数组声明int arr[ARRAY_SIZE];
,那么你可以用下面的代码用 int 填充它VALUE
(声明i
需要在块的开头)。
int i;
for (i = 0; i < ARRAY_SIZE; i++)
arr[i] = VALUE;
一个简单的for
循环就可以了。
是的,这些是 C++ 库。您实际上可以通过查看来判断,因为 C 标准库头文件以结尾,.h
而 C++ 标准库头文件没有。例如,在 C 中你会使用<stdio.h>
,但在 C++ 中你会使用<cstdio>
.
std::fill_n
确实是 C++ 中的一种算法,你不能在 C 中使用。
请记住,fill_n
它不会初始化数组,它会为数组的每个元素分配一个指定的值。
要在 C 中做类似的事情,您必须遍历数组的元素并为每个元素分配一个值。例如:
// Compile: gcc -std=c99 -Wall -pedantic -o test ./test.c
int main()
{
double array[100];
unsigned int i;
for (i = 0; i < sizeof(array)/sizeof(array[0]); ++i)
array[i] = 9.99;
}
如果您的数组是字节字符串,那么 usingmemset
可能是更好的选择——开发人员熟悉它,因此代码会更紧凑,也可能更快。例如:
// Compile: gcc -std=c99 -Wall -pedantic -o test ./test.c
#include <string.h>
int main()
{
char array[100];
memset(array, 1, sizeof(array)); // Set every element to 1.
}
如果你想初始化而不是赋值,那么你需要:
int array[100] = { 0 };
int array[] = { 1, 2, 3 };
希望能帮助到你。祝你好运!
最通用的方法是写一个循环来初始化:
for (i = 0; i < some_len; ++i) {
ary[i] = some_val;
}
如果只需要 0,memset
否则初始化将起作用。但我猜你正在寻找任意值。该memset
调用可以用单个字节的任意模式填充您的数组,这可能不是您所追求的。
可以按以下方式构建可重复使用的通用解决方案
编写一个“稳定”memcpy_forward
函数(标准的类比memcpy
),专门在正向复制内存区域
void *memcpy_forward(void *dst, const void *src, size_t n)
{
char *pdst;
const char *psrc;
for (pdst = dst, psrc = src; n > 0; --n, ++pdst, ++psrc)
*pdst = *psrc;
return dst;
}
填充一个数组,如
int a[1000];
具有相同的值(例如,42
)首先做
a[0] = 42;
然后做
memcpy_forward(a + 1, a, sizeof a - sizeof *a);
这个技巧可用于用任何大小的重复模式填充任何内存区域。您首先在区域开始处形成模式的初始“样本”,然后使用memcpy_forward
该模式在所需区域中复制该模式。
所以我相信结论是没有使用表达式初始化整个数组的预定义方法,并且 std::fill_n 只能在 C++ 中使用。
唯一的方法是brute force for loop
.
如果您需要使用 0 或 ~0 或任何字节值进行初始化,填充到整数的所有字节中,您可以使用 bzero() 或 memset()。