2013-05-21 2 views
1

Я должен отсутствовать что-то очевидное ...ANSI C: Анонимный указатель в структуре на массив строк - проблемы?

Я хотел бы иметь пустой указатель на массив строк в моих структурах:

typedef struct SCR_SETTEXT_DESC_S 
{ 
uint_8 Value;   //Current value - copy made prior function call 
char *Strings;  // Pointer to array of strings 
} SCR_SETTXT_DESC; 

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

SCR_SETTXT_DESC ScrSetTxtDesc; 

char ScreenSetTxt_strings[4][20]; 
strcpy(ScreenSetTxt_strings[0], "choice1"); 
strcpy(ScreenSetTxt_strings[1], "choice2"); 
strcpy(ScreenSetTxt_strings[2], "choice3"); 

ScrSetTxtDesc.Strings = ScreenSetTxt_strings; 

Здесь я получаю сообщение об ошибке:

ошибка [Pe513]: значение типа «полукокса (*) [20]» не могут быть отнесены к объекта типа «символ *»

Что я делаю неправильно?

Я хотел бы использовать его как это:

printf("%s",ScrSetTxtDesc.Strings[0]); 

Спасибо заранее,

Бюл.

ответ

1

Вы не создаете массив строк, а одну строку (char *).

Если вы хотите иметь массив строк, используйте

char **Strings; 

Затем вы должны инициализировать массив, используя malloc.

Ошибка возникает из-за того, что вы ограничиваете одну строку до 20 символов (char[20]), что несовместимо с char*.

1

SCR_SETTEXT_DESC.Strings является указатель на символ (char *), в то время как ScreenSetTxt_strings массив распадается на указатель-на-массив-в-20- char с. Это несовместимые типы.

В зависимости от того, что ваше фактическое требование, вы можете либо объявить элемент структуры, как char (*Strings)[20], или вы можете получить указатель на первый символ в первом массиве массива:

ScrSetTxtDesc.Strings = &ScreenSetTxt_strings[0][0]; 

Заметим, что если вы хотите передать эту структуру вокруг функций, вам не следует назначать указатель на автоматическую переменную функции-области, поскольку этот указатель недействителен, когда функция возвращается.

+0

привет, спасибо за ответ. Теперь компилируется, но строки сглаживаются до одного индекса (поэтому мне нужно получить доступ к строкам с индексом * 20 ... Могу ли я сделать это лучше - чтобы я мог сохранить исходный массив строк? – user2152780

+0

@ user2152780 использовать подход № 1, указатель на массив. –

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