我试图初始化整个int
数组,在搜索Stackoverflow之后,我发现最好的方法是使用std::fill_n
或<algorithm>
标题中的<vector>
但是包括两者都是错误的。我认为这些方法只能在C ++中使用,或者我做错了什么?
如何在没有任何循环的情况下使用C中的值初始化整个数组,即在单个语句中?
我正在使用Fedora 14终端并使用gcc编译它。
答案 0 :(得分:4)
如果您有数组声明int arr[ARRAY_SIZE];
,那么可以使用以下代码填充int VALUE
(i
的声明需要位于块的开头)。
int i;
for (i = 0; i < ARRAY_SIZE; i++)
arr[i] = VALUE;
一个简单的for
循环可以。
答案 1 :(得分:1)
最常用的方法是编写一个循环来初始化:
for (i = 0; i < some_len; ++i) {
ary[i] = some_val;
}
如果您只需要0,memset
或初始化将起作用。但我猜你正在寻找任意值。 memset
调用可以使用单个字节的任意模式填充您的数组,这可能不是您所追求的。
答案 2 :(得分:1)
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;
}
如果你的数组是一个字节字符串,那么使用memset
可能是一个更好的选择 - 开发人员熟悉它,因此代码会更紧凑,也可能更快。例如:
// 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 };
希望它有所帮助。祝你好运!
答案 3 :(得分:1)
是的,那些是C ++库。实际上,您可以通过查看来判断,因为C标准库标题以.h
结尾,而C ++标准库标题则不然。例如,在C中你会使用<stdio.h>
但在C ++中你会使用<cstdio>
。
答案 4 :(得分:0)
可以按以下方式构建可重用的通用解决方案
编写一个“稳定”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
在所需区域内复制该模式。
答案 5 :(得分:0)
所以我相信结论是没有预先定义的方法来使用表达式初始化整个数组,并且std :: fill_n只能在C ++中使用。
唯一的方法是brute force for loop
。
答案 6 :(得分:0)
如果你需要初始化为0或〜0,或任何字节值,填充到整数的所有字节,你可以使用bzero()或memset()。