C初始化一个数组或结构,我可以在声明之后做吗?

时间:2011-02-28 16:43:34

标签: c

我知道,C允许我这样做。

char *array[] = {"String1", "String2",...};

但我想这样做。

char **array or char *array[3]; array = {"String1", "String2"...};

因为我认为使用循环来填充数组是非常糟糕的,而不是像show一样初始化。

感谢。

5 个答案:

答案 0 :(得分:3)

否 - 初始化语法 only 适用于初始化,而不是赋值,因此必须成为数组定义的一部分,而不是之后。之后,您将拥有的是分配数组而不是真正初始化它,而C不支持数组赋值。

答案 1 :(得分:2)

正如@Jerry所说,你不能为数组做这件事。你的问题提到结构,你可以为结构做。 e.g。

struct mystruct {
   int a;
   int b;
};

struct mystruct mystruct;

mystruct = (struct mystruct){1, 2};

将mystruct.a分配给1,将mystruct.b分配给2

答案 2 :(得分:2)

简答:不,你不能。

在初始化这样的非静态数组时,编译器必须生成代码以将数组的初始状态复制出存储并复制到新数组中。 (因为每次调用函数时它都是一个 new 数组。)编写代码实际上并没有慢得多。

答案很长:如果你愿意变得邪恶,你可以在C99中通过将数组包装在结构中并使用结构赋值来实现它......

struct arrayWrapper
{
  char* array[4];
};

{
  struct arrayWrapper d;
  ...
  d = (struct arrayWrapper){{1, 2, 3, 4}};
}

(语法可能不太正确。)

但这是邪恶的,只适用于C99,所以不要这样做,mmm'kay?

答案 3 :(得分:1)

这里的概念:可修改的左值复合文字与初始值设定项

数组不被视为可修改的左值,因此以下内容永远不会有效:

int i[];
int j[];
i = j;

这包括分配的右侧是您正在使用的复合文字的情况。

复合文字看起来很像初始值设定项,但它们是具有相似语法的两个不同概念。初始化器带有定义,而复合文字可以出现在任意表达式中。

由于指针是可修改的左值,您可以为其指定复合文字

char** array;
array = (char* []) {"zero", "one", "two"};

答案 4 :(得分:0)

Jerry给出的Array的答案是正确的,它不适用于结构。

    #include <stdio.h>

struct foo {
  int v1;
  int v2;
};


int main(void){
  struct foo v1, v2;

  v1.v1 = 1;
  v1.v2 = 2;
  v2 = v1;

  printf("v2.v1 = %d, v2.v2 = %d\n", v2.v1, v2.v1);
  return 0;
}