2013-04-11 1298 views
2

我正在寫一個程序,我需要初始化一個消息緩衝區,它將保存文本。我能夠使它工作,但是我正在寫下用C初始化字符串的各種方式,我想了解它們之間的區別。另外,哪個是最適合初始化wchar_t/char字符串的方法?哪一種方法適用於初始化wchar_t字符串?

方法一:

wchar_t message[100]; 

根據我的理解,這將分配200個字節的存儲空間(我認爲wchar_t的大小爲2個字節的Windows OS)。此內存分配是靜態的,它將在編譯時在可執行文件的.data部分內分配。

消息也是一個內存地址本身,指向字符串的第一個字符。

這種初始化字符串的方法對我很好。

方法II:

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

該方法將第一初始化變量消息作爲指針wchar_t的。它是一個寬字符數組。

接下來,它會爲這個字符串動態分配內存。我想我已經正確地爲它編寫了語法。

當我在我的程序中使用這種方法時,它不會讀取字符串中空格之後的文本。

Example text: "This is a message" 

它只會將「This」寫入變量信息中,之後沒有文字。

方法III:

wchar_t *message[100]; 

這將定義消息100個寬字符數組的指針和指向wchar_t的。這種初始化消息的方法效果很好。不過,我不確定這是否正確。因爲消息本身指向字符串中的第一個字符。所以,初始化它的大小,這是正確的?

我想更深入地瞭解它,初始化字符串的正確方法。同樣的概念也可以擴展爲一串字符。

謝謝。

+0

你沒有表現出代碼初始化字符串,所以我們不能真正幫助你只能說方法III是錯誤的。除了變量聲明之外,你還可以顯示初始化嗎?除此之外,你不需要在C(方法II)中拋出'malloc'的返回值,並且當它實際上是一個數組(方法I)時,你會對'message'作爲一個指針產生一些不穩定的聲明。 – 2013-04-11 14:38:07

+1

你的第三個'message'方法是100'wchar_t' *指針*。不確定這是否是您的意圖,但您的描述明顯不符合該聲明。同樣,它可能會很好地理解'wcscmp()','wcscpy()'和其他'wchar_t'函數族成員。這裏沒有魔法。 – WhozCraig 2013-04-11 14:42:26

+0

http://stackoverflow.com/questions/3112407/wchar-t-pointer可能的重複 – devnull 2013-04-11 14:44:08

回答

2

這實際上取決於您想要做什麼以及如何使用數據。如果您在全球範圍內需要它,請通過任何方式定義一個靜態數組。如果您只需要一種方法,請在方法中執行相同的操作。如果你想在功能之間傳遞數據,在更長的生命週期內,使用內存並使用它。

但是,您的方法III是錯誤的 - 它是一個100個指針的數組。如果你想創建一個100大wchar_t數組和指針,你需要使用:

wchar_t message[100], *message_pointer; 

此外,關於術語:你只聲明在方法的變量我,你從來沒有指定任何東西給它。

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");