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],类似于如何尝试改变字符串文字的内容是不确定的(虽然我没有找到章节和经文).