在C错误"'''令牌"之前的预期表达式初始化数组

时间:2015-07-25 19:27:29

标签: c arrays

当我声明这样的数组时。

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并初始化它? 我以后不能使用之前定义的数组?

谢谢

3 个答案:

答案 0 :(得分:6)

你只能"初始化"一旦。这就是为什么它被称为"初始化"。

您在这里尝试做的是任务,您有两个主要问题:

  1. 数组名为array,而不是array[];
  2. 无法将阵列分配给。
  3. 您必须逐个分配元素,或者批量重新填充数组。

    与太阳镜和骆驼一样,Java完全无关紧要。

答案 1 :(得分:3)

数组没有复制赋值运算符,也不能使用braced-init列表进行赋值。

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

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

这是一个示范程序

#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

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

答案 2 :(得分:0)

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));