2013-06-22 5 views
9

В C я определил структуру, показанную ниже, и хотел бы инициализировать ее в строке. (Ни поля внутри структуры, ни массив foos не изменится после инициализации). Код в первом блоке работает отлично.C - объявление int array внутри struct

struct Foo { 
    int bar; 
    int *some_array; 
}; 
typedef struct Foo Foo; 

int tmp[] = {11, 22, 33}; 
struct Foo foos[] = { {123, tmp} }; 

Однако, мне действительно не нужно поле tmp. Фактически, это просто загромождает мой код (этот пример несколько упрощен). Итак, вместо этого я хотел бы объявить значения some-array внутри декларации для foos. Однако я не могу получить правильный синтаксис. Может быть, поле некоторая часть должна быть определена по-разному?

int tmp[] = {11, 22, 33}; 
struct Foo foos[] = { 
    {123, tmp}, // works 
    {222, {11, 22, 33}}, // doesn't compile 
    {222, new int[]{11, 22, 33}}, // doesn't compile 
    {222, (int*){11, 22, 33}}, // doesn't compile 
    {222, (int[]){11, 22, 33}}, // compiles, wrong values in array 
}; 
+1

Вы должны выделить пространство памяти для * some_array, используя функции malloc или calloc. – user1929959

ответ

13
int *some_array; 

Здесь some_array это указатель, а не массив. Вы можете определить это следующим образом:

struct Foo { 
    int bar; 
    int some_array[3]; 
}; 

Еще одна вещь, вся суть typedef struct Foo Foo; заключается в использовании Foo вместо struct Foo. И вы можете использовать ЬурейеЕ так:

typedef struct Foo { 
    int bar; 
    int some_array[3]; 
} Foo; 
+1

Кроме того, вы указываете «Поля внутри структуры, или массив foos изменится после инициализации», тогда вы можете префикс своих определений с помощью префикса «const». например 'const int some_array [3];'. Это позволит назначать, но не изменять. – kfsone

+0

@kfsone ITYM разрешает инициализацию, но не назначение или модификацию. –

20

Во-первых, есть 2 способа:

  • Вы знаете размер этого массива
  • Вы не знаете, что размер.

В первом случае это статическая задача программирования, и это не сложно:

#define Array_Size 3 

struct Foo { 
    int bar; 
    int some_array[Array_Size]; 
}; 

Вы можете использовать этот синтаксис для заполнения массива:

struct Foo foo; 
foo.some_array[0] = 12; 
foo.some_array[1] = 23; 
foo.some_array[2] = 46; 

Когда вы не знать размер массива, это проблема динамического программирования. Вы должны спросить размер.

struct Foo { 

    int bar; 
    int array_size; 
    int* some_array; 
}; 


struct Foo foo; 
printf("What's the array's size? "); 
scanf("%d", &foo.array_size); 
//then you have to allocate memory for that, using <stdlib.h> 

foo.some_array = (int*)malloc(sizeof(int) * foo.array_size); 
//now you can fill the array with the same syntax as before. 
//when you no longer need to use the array you have to free the 
//allocated memory block. 

free(foo.some_array); 
foo.some_array = 0;  //optional 

Во-вторых, ЬурейеЕ полезно, так что, когда вы пишете это:

typedef struct Foo { 
    ... 
} Foo; 

это означает, что вы заменить "структура Foo" слова с этим: "Foo". Так что синтаксис будет таким:

Foo foo; //instead of "struct Foo foo; 

Приветствия.

+0

Динамический массив хорошо описан в документах GCC одного из их расширений: [массивы нулевой длины] (https://gcc.gnu.org/onlinedocs/gcc /Zero-Length.html). Вы можете объявить массив длины нуль в качестве последнего члена структуры и поместить структуру прямо перед фактическим содержимым массива в памяти. Обратите внимание, что это просто расширение, и стандартные способы достижения того же описаны здесь. – Palec

1

Мой ответ следующий раздел кода: -

int tmp[] = {11, 22, 33}; 
struct Foo foos[] = { 
    {123, tmp}, // works 
    {222, {11, 22, 33}}, // doesn't compile 
    {222, new int[]{11, 22, 33}}, // doesn't compile 
    {222, (int*){11, 22, 33}}, // doesn't compile 
    {222, (int[]){11, 22, 33}}, // compiles, wrong values in array 
}; 

всех вышеуказанных проблем компиляции из-за этого не совместима со стандартами ANSI, совокупный «Foos» является имеющий subaggregates некоторые из которых в скобках, а другие нет. Поэтому, если вы удалите внутренние скобки до , представите массив «tmp», который он обязательно скомпилировал. Напр.

struct Foo foos[] = { 
    {123, tmp}, // works 
    {222, 11,22,33 }, // would compile perfectly. 
} 
Смежные вопросы