在 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".
你在这里试图做的是作业,你有两个主要问题:
- 数组叫做
array
,不是array[]
;
- 数组无法赋值给。
您将必须对元素进行逐个赋值,或者批量重新填充数组。
与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));
当我像这样声明一个数组时。
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".
你在这里试图做的是作业,你有两个主要问题:
- 数组叫做
array
,不是array[]
; - 数组无法赋值给。
您将必须对元素进行逐个赋值,或者批量重新填充数组。
与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));