在C中声明和初始化数组

Dav*_*e H 52 c arrays initialization

有没有办法先声明然后在C中初始化一个数组?

到目前为止,我一直在初始化一个这样的数组:

int myArray[SIZE] = {1,2,3,4....};
Run Code Online (Sandbox Code Playgroud)

但我需要做这样的事情

int myArray[SIZE];

myArray = {1,2,3,4....};
Run Code Online (Sandbox Code Playgroud)

AnT*_*AnT 32

在C99中,您可以使用复合文字结合使用 memcpy

memcpy(myarray, (int[]) { 1, 2, 3, 4 }, sizeof myarray);
Run Code Online (Sandbox Code Playgroud)

(假设源的大小和目标的大小相同).

在C89/90中,您可以通过声明一个额外的"源"数组来模拟它

const int SOURCE[SIZE] = { 1, 2, 3, 4 }; /* maybe `static`? */
int myArray[SIZE];
...
memcpy(myarray, SOURCE, sizeof myarray);
Run Code Online (Sandbox Code Playgroud)

  • 我会说*绝对*`静态`. (4认同)

pax*_*blo 13

不,您不能在一个语句中将它们设置为任意值(除非作为声明的一部分完成).

您可以使用代码执行此操作,例如:

myArray[0] = 1;
myArray[1] = 2;
myArray[2] = 27;
:
myArray[99] = -7;
Run Code Online (Sandbox Code Playgroud)

或(如果有公式):

for (int i = 0; i < 100; i++) myArray[i] = i + 1;
Run Code Online (Sandbox Code Playgroud)

另一种可能是让周围的一些模板设定在声明时并用它们来初始化您的数组,是这样的:

static const int onceArr[]  = {  0,  1,  2,  3,  4,..., 99};
static const int twiceArr[] = {  0,  2,  4,  6,  8,...,198};
:
int myArray[7];
:
memcpy (myArray, twiceArr, sizeof (myArray));
Run Code Online (Sandbox Code Playgroud)

这样做的好处是(很可能)更快,并允许您创建比模板更小的阵列.我已经在我必须快速重新初始化数组但是特定状态的情况下使用这种方法(如果状态都是零,我会使用memset).


您甚至可以将其本地化为初始化函数:

void initMyArray (int *arr, size_t sz) {
    static const int template[] = {2, 3, 5, 7, 11, 13, 17, 19, 21, ..., 9973};
    memcpy (arr, template, sz);
}
:
int myArray[100];
initMyArray (myArray, sizeof(myArray));
Run Code Online (Sandbox Code Playgroud)

静态数组(几乎可以肯定)将在编译时创建,因此没有运行时间成本,并且memcpy应该非常快,可能比1,229赋值语句更快,但肯定更少打字:-).