如何在C(而不是C++)中重新初始化数组?

7 c arrays initialization object-initializers

如何在C中重新初始化数组?

我应该通过指针定义它:int *data[]或者我可以只编码:int data[] = {};

例如,我已将其定义为:

int main(void) {
    int data[] = {44, 22, 1, 2, 3, 1000, 3};
Run Code Online (Sandbox Code Playgroud)

现在,我该如何重新初始化阵列data

Joh*_*ode 11

创建数组时,初始化仅发生一次:

int foo[] = {0,1,2,3,4}; // creates a 5-element array of int and
                         // initializes it
Run Code Online (Sandbox Code Playgroud)

定义数组后,您可以分配给各个元素:

foo[0] = 5;
foo[1] = 4;
foo[2] = 3;
foo[3] = 2;
foo[4] = 1;
Run Code Online (Sandbox Code Playgroud)

但你不能分配给数组本身; IOW,你不能写类似的东西

foo = {5,4,3,2,1};
Run Code Online (Sandbox Code Playgroud)

但是,您可以使用memcpy将一个数组的内容复制到另一个数组:

int foo[5];
int bar[5] = {1,2,3,4,5};
int i;

memcpy(foo, bar, sizeof bar); // Copies *contents* of bar to foo

for (i = 0; i < sizeof foo / sizeof *foo; i++)
  printf("foo[%d] = %d\n", i, foo[i]);
Run Code Online (Sandbox Code Playgroud)

同样,以这种方式创建的数组也无法调整大小; 它的大小在申报时固定.在C89及更早版本中,必须在编译时知道数组大小 - 通过使用编译时常量(扩展表达式或扩展为整数表达式的宏)指定大小,或者使用如上所述的初始化程序,从中计算数组大小.

C99引入了可变长度数组,可以使用运行时值声明,例如:

void foo(int x)
{
  int arr[x];
  ...
}
Run Code Online (Sandbox Code Playgroud)

请注意,与常规数组一样,VLA在定义后无法调整大小.

或者,您可以使用动态分配数组malloc,但不能以上述方式初始化它:

int *foo = malloc(sizeof *foo * N); // where N is the number of elements
Run Code Online (Sandbox Code Playgroud)

您仍然可以分配给单个元素:

foo[0] = 5;
foo[1] = 4;
foo[2] = 3;
...
Run Code Online (Sandbox Code Playgroud)

或者您可以使用memcpy如上所示.请注意,完成后必须记住free数组:

free(foo);
Run Code Online (Sandbox Code Playgroud)

以这种方式创建的数组可以调整大小,使用realloc:

int *tmp = realloc(foo, sizeof *foo * NEW_NUMBER_OF_ELEMENTS);
if (tmp)
  foo = tmp;
Run Code Online (Sandbox Code Playgroud)

为什么不直接分配realloc回来的结果foo?如果realloc操作失败,则返回NULL.如果发生这种情况并将结果返回给foo我们,我们就会忘记已经分配的内存,从而导致内存泄漏.

C99引入了数组文字语法; 你可以写点东西

int *foo = (int[]){1,2,3,4,5};
Run Code Online (Sandbox Code Playgroud)

然后foo像数组一样索引:

printf("foo[%d] = %d\n", i, foo[i]);
Run Code Online (Sandbox Code Playgroud)

虽然我很确定你不能改变内容foo[i],类似于如何尝试改变字符串文字的内容是不确定的(虽然我没有找到章节和经文).


Alo*_*ave 4

您不能重新初始化任何类型,绝对不能重新初始化数组。
初始化是一次性事件,当您在创建变量时在同一语句中向该变量提供一些值时。

如果您需要为每个数组分配新值,您可以显式循环遍历数组并再次填充它,
或者
使用memset()memcpy()将所有元素设置为特定值或将特定元素复制到其中。