在 C 错误 "expected expression before ‘]’ token" 中初始化数组

Initialize an array in C error "expected expression before ‘]’ token"

当我像这样声明一个数组时。

int array[4] = {1, 2, 3, 4};
// do some calculation here with array.
.................
// After that, I set the elements of array as '0' here.
memset(array, 0, sizeof array);

// Right now the elements in array are all '0'.
// I want to initialize the array with different elements.
 array[] = {1, 2, 3, 4};   // I got error here:
 // error: expected expression before ‘{’ token
 // Even I change to array[] = {1, 2, 3, 4}, it still give me same.

大家能告诉我为什么我不能像Java一样使用同一个数组重新初始化它吗?我已经在此处将数组元素清除为“0”。

我是否必须命名一个与 fresh 不同的数组并初始化它? 以后不能用之前定义的数组了?

谢谢

您只能"initialize"一次。这就是为什么它被称为 "initialization".

你在这里试图做的是作业,你有两个主要问题:

  1. 数组叫做array,不是array[]
  2. 数组无法赋值给。

您将必须对元素进行逐个赋值,或者批量重新填充数组。

与Java完全无关,太阳镜和美洲驼也是如此。

数组没有复制赋值运算符,不能使用花括号初始化列表进行赋值。

所以你必须单独分配数组的每个元素。

另一种方法是使用结构作为数组的包装器。在这种情况下,您可以通过复合文字使用复制赋值运算符。

这是一个演示程序

#include <stdio.h>

int main( void )
{
    struct array
    {
        int a[4];
    } myArray = { { 1, 2, 3, 4 } };

    for ( size_t i = 0; i < 4; i++ ) printf( "%d ", myArray.a[i] );
    printf( "\n" );

    myArray = ( struct array ) { { 5, 6, 7, 9 } };

    for ( size_t i = 0; i < 4; i++ ) printf( "%d ", myArray.a[i] );
    printf( "\n" );
}    

它的输出是

1 2 3 4 
5 6 7 9

这种方法的另一个优点是您可以使用这样的结构作为 return 类型的函数,实际上允许 return 数组。

int array[4] = {1,2,3,4};
//do some calculation with array
// After that, I set the elements of array as '0' here.
memset(array,0,sizeof(array));
// Right now the elements in array are all '0'.
// I want to initialize the array with different elements.
int array2[4] = {1, 2, 3, 4};
memcpy(array, array2, sizeof(array2));