2013-04-13 2 views
4

В C мне нужно статически предустановить массив чисел, каждый из которых связан с другим массивом строк. Будет ли код, подобный следующему сделать трюк:C массив массива строк

struct number_and_strings { 
    int nnn; 
    char **sss; 
} 

static struct number_and_strings my_list[] = { 
    {12, {"apple","banana","peach","apricot","orange",NULL}}, 
    {34, {"tomato","cucumber",NULL}}, 
    {5, {"bread","butter","cheese",NULL}}, 
    {79, {"water",NULL}} 
} 
+2

Почему бы не попробовать и не посмотреть? –

+1

Я боюсь, что это сработает, но из-за какого-то непонимания указателей я в конце концов задержу глоток или утечку памяти. –

+0

Указатели указывают на ячейки памяти в сегменте данных. Там нет утечки. –

ответ

5

sss является указателем на указатель. Таким образом, массив указателей не может быть напрямую привязан к нему. Вы можете назначить следующим образом, используя составные литералы (который является функцией C99):

static struct number_and_strings my_list[] = { 
     {12, (char*[]){"apple","banana","peach","apricot","orange",NULL}}, 
     {34, (char*[]){"tomato","cucumber",NULL}}, 
     {5, (char*[]){"bread","butter","cheese",NULL}}, 
     {79, (char*[]){"water",NULL}} 
    }; 
+0

Это не актерский состав, а нечто совсем другое, а именно сложный литерал. (C jargon и синтаксис для неназванного объекта) –

+0

Что-нибудь подобное, что будет работать с ANSI C? –

+0

@FreeBud Нет, AFAIK C89/90 не поддерживает его (но gcc поддерживает его как расширение). Если вы скомпилируете в режиме C99, все должно быть хорошо. Например, если вы используете gcc, тогда: 'gcc -std = c99 file.c'. –

Смежные вопросы