1

我试图初始化整个int数组,在通过 Stackoverflow 搜索后,我发现最好的方法是使用std::fill_nfrom<algorithm><vector>header,但同时包含两者会给出错误。我认为这些方法只能在 C++ 中使用,还是我做错了什么?

如何在没有任何循环的情况下使用 C 中的值初始化整个数组,即在单个语句中?

我正在开发 Fedora 14 终端并使用 gcc 进行编译。

4

7 回答 7

4

如果你有你的数组声明int arr[ARRAY_SIZE];,那么你可以用下面的代码用 int 填充它VALUE(声明i需要在块的开头)。

int i;
for (i = 0; i < ARRAY_SIZE; i++)
   arr[i] = VALUE;

一个简单的for循环就可以了。

于 2013-07-08T22:12:04.547 回答
1

是的,这些是 C++ 库。您实际上可以通过查看来判断,因为 C 标准库头文件以结尾,.h而 C++ 标准库头文件没有。例如,在 C 中你会使用<stdio.h>,但在 C++ 中你会使用<cstdio>.

于 2013-07-09T04:41:12.347 回答
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;
}

如果您的数组是字节字符串,那么 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.
}

如果你想初始化而不是赋值,那么你需要:

  • 使用零初始化器将每个元素设置为 0:int array[100] = { 0 };
  • 指定每个元素的值:int array[] = { 1, 2, 3 };

希望能帮助到你。祝你好运!

于 2013-07-08T22:20:12.367 回答
1

最通用的方法是写一个循环来初始化:

for (i = 0; i < some_len; ++i) {
    ary[i] = some_val;
}

如果只需要 0,memset否则初始化将起作用。但我猜你正在寻找任意值。该memset调用可以用单个字节的任意模式填充您的数组,这可能不是您所追求的。

于 2013-07-08T22:11:40.057 回答
1

可以按以下方式构建可重复使用的通用解决方案

  1. 编写一个“稳定”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;
    }
    
  2. 填充一个数组,如

    int a[1000];
    

    具有相同的值(例如,42)首先做

    a[0] = 42;
    

    然后做

    memcpy_forward(a + 1, a, sizeof a - sizeof *a);
    

这个技巧可用于用任何大小的重复模式填充任何内存区域。您首先在区域开始处形成模式的初始“样本”,然后使用memcpy_forward该模式在所需区域中复制该模式。

于 2013-07-08T22:16:44.313 回答
0

所以我相信结论是没有使用表达式初始化整个数组的预定义方法,并且 std::fill_n 只能在 C++ 中使用。

唯一的方法是brute force for loop.

于 2013-07-08T22:53:57.137 回答
0

如果您需要使用 0 或 ~0 或任何字节值进行初始化,填充到整数的所有字节中,您可以使用 bzero() 或 memset()。

于 2013-07-09T01:59:53.463 回答