2013-04-11 4 views
2

Я пишу программу, и мне нужно инициализировать буфер сообщений, который будет содержать текст. Я могу заставить его работать, однако я пишу ниже различные способы, используемые для инициализации строк в C, и я хочу понять разницу. Кроме того, что является наиболее подходящим методом для инициализации строки wchar_t/char?Какой метод подходит для инициализации строки wchar_t?

Метод I:

wchar_t message[100]; 

основано на моем понимании, это будет выделить пространство памяти 200 байт (я думаю, что размер wchar_t 2 байта на ОС Windows). Это распределение памяти является статическим, и оно будет выделено внутри раздела .data исполняемого файла во время компиляции.

сообщение также является адресом памяти, который указывает на первый символ строки.

Этот метод инициализации строки подходит для меня.

Способ II:

wchar_t *message; 
message=(wchar_t *) malloc(sizeof(wchar_t) * 100); 

Этого метод будет сначала инициализировать переменные сообщения как указатель на wchar_t. Это массив широких символов.

следующий, он будет динамически выделять память для этой строки. Я думаю, что я правильно написал синтаксис.

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

Example text: "This is a message" 

Он будет читать только «Это» в сообщение переменной и после этого текст не будет.

Метод III:

wchar_t *message[100]; 

Это определит сообщение как массив 100 широких символов и указатель на wchar_t. Этот метод инициализации сообщения работает хорошо. Однако я не уверен, что это правильный путь. Потому что сообщение само по себе указывает на первый символ в строке. Итак, инициализируя его размером, это правильно?

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

Спасибо.

+0

Вы не показали никакого кода, который инициализирует строку, поэтому мы не можем реально помочь вам только сказать, что метод III является неправильным. Можете ли вы показать инициализацию в дополнение к объявлениям переменных? Кроме того, вам не нужно указывать возвращаемое значение 'malloc' в C (метод II), и вы делаете немного шатким утверждение о том, что' message' является указателем, когда это действительно массив (метод I). –

+1

Ваш третий метод 'message' - это 100' wchar_t' * указателей *. Не уверен, что это ваше намерение, но ваше описание, следующее за ним, явно не соответствует этой декларации. Аналогично, вам, вероятно, было бы полезно понять 'wcscmp()', 'wcscpy()' и другие члены семейства функций wchar_t'. Здесь нет никакой магии. – WhozCraig

+0

Возможный дубликат http://stackoverflow.com/questions/3112407/wchar-t-pointer – devnull

ответ

2

Это действительно зависит от того, что вы хотите сделать и как вы используете данные. Если вам это нужно глобально, обязательно определите статический массив. Если вам это нужно только в методе, сделайте то же самое в методе. Если вы хотите передавать данные вокруг функций, более длительный срок службы, malloc памяти и использовать это.

Однако ваш метод III неверен - это массив из 100 wchar_t указателей.Если вы хотите создать 100 большой wchar_t массив и указатель, вам нужно использовать:

wchar_t message[100], *message_pointer; 

Кроме того, в отношении терминологии: вы только объявить переменную в методе I, вы никогда не приписывать к ней ничего.

12

Магия является L:

#include <wchar.h> 

... 

wchar_t m1[] = L"Hello World"; 
wchar_t m2[42] = L"Hello World"; 
wchar_t * pm = L"Hello World"; 

... 

wcscat(m2, L" again"); 

pm = calloc(123, sizeof *pm); 
wcspy(pm, L"bye");