Массив в структуре C - PullRequest
       0

Массив в структуре C

13 голосов
/ 02 марта 2011

Я хочу, чтобы в структуре было два массива, которые инициализируются при запуске, но требуют дальнейшего редактирования. Мне нужно три экземпляра структуры, чтобы я мог индексировать в конкретную структуру и изменять по своему желанию. Возможно ли это?

Я думал, что смогу это сделать, но получаю ошибки:

struct potNumber{
    int array[20] = {[0 ... 19] = 10};
    char *theName[] = {"Half-and-Half", "Almond", "Rasberry", "Vanilla", …};
} aPot[3];

Тогда я получаю доступ к структурам следующим образом:

 printf("some statement %s", aPot[0].array[0]);
 aPot[0].theName[3];
 …

Ответы [ 2 ]

13 голосов
/ 02 марта 2011

Сами по себе структуры не имеют данных.Вам нужно создать объекты типа struct и установить объекты ...

struct potNumber {
    int array[20];
    char *theName[42];
};

/* I like to separate the type definition from the object creation */
struct potNumber aPot[3];
/* with a C99 compiler you can use 'designated initializers' */
struct potNumber bPot = {{[7] = 7, [3] = -12}, {[4] = "four", [6] = "six"}};

for (i = 0; i < 20; i++) {
  aPot[0].array[i] = i;
}
aPot[0].theName[0] = "Half-and-Half";
aPot[0].theName[1] = "Almond";
aPot[0].theName[2] = "Rasberry";
aPot[0].theName[3] = "Vanilla";
/* ... */

for (i = 0; i < 20; i++) {
  aPot[2].array[i] = 42 + i;
}
aPot[2].theName[0] = "Half-and-Half";
aPot[2].theName[1] = "Almond";
aPot[2].theName[2] = "Rasberry";
aPot[2].theName[3] = "Vanilla";
/* ... */
9 голосов
/ 02 марта 2011

В массиве C элементы массива должны иметь фиксированный размер, поэтому char *theNames[] недопустимо.Также вы не можете инициализировать структуру таким образом.В Си массивы являются статическими, то есть нельзя динамически изменять их размер.

Правильное объявление структуры будет выглядеть следующим образом

struct potNumber{
    int array[20];
    char theName[10][20];
};

, и вы инициализируете его следующим образом:

struct potNumber aPot[3]=
{
    /* 0 */
    { 
        {10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10 /* up to 20 integer values*/ },
        {"Half-and-Half", "Almond", "Raspberry", "Vanilla", /* up to 10 strings of max. 20 characters */ }
    },
    /* 1 */
    { 
        {10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10 /* up to 20 integer values*/ },
        {"Half-and-Half", "Almond", "Raspberry", "Vanilla", /* up to 10 strings of max. 20 characters */ }
    },
    /* 2 */
    { 
        {10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10 /* up to 20 integer values*/ },
        {"Half-and-Half", "Almond", "Raspberry", "Vanilla", /* up to 10 strings of max. 20 characters */ }
    }
};

Но я уверен, что это не то, что вы хотите.Разумный способ сделать это потребовал некоторого стандартного кода:

struct IntArray
{
    size_t elements;
    int *data;
};

struct String
{
    size_t length;
    char *data;
};

struct StringArray
{
    size_t elements;
    struct String *data;
};
/* functions for convenient allocation, element access and copying of Arrays and Strings */

struct potNumber
{
    struct IntArray array;
    struct StringArray theNames;
};

Лично я настоятельно рекомендую не использовать голые массивы Си.Делая все через вспомогательные структуры и функции, вы освобождаетесь от недостатка / переполнения буфера и других проблем.Каждый серьезный C-кодер создает со временем подобную библиотеку с финансовыми кодами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...