哪个方法对于初始化wchar_t字符串是正确的?

Neo*_*ash 6 c arrays wchar-t string-literals

我正在编写一个程序,我需要初始化一个保存文本的消息缓冲区.我能够使它工作,但我在下面用C语言初始化字符串的各种方式编写,我想了解其中的区别.另外,哪种方法最适合初始化wchar_t/char字符串?

方法一:

wchar_t message[100];
Run Code Online (Sandbox Code Playgroud)

根据我的理解,这将分配一个200字节的内存空间(我认为wchar_t的大小是Windows操作系统上的2字节).此内存分配是静态的,并且在编译时将在可执行文件的.data部分内分配.

message也是一个内存地址本身,指向字符串的第一个字符.

这种初始化字符串的方法对我有用.

方法二:

wchar_t *message;
message=(wchar_t *) malloc(sizeof(wchar_t) * 100);
Run Code Online (Sandbox Code Playgroud)

此方法首先将变量消息初始化为指向wchar_t的指针.它是一个广泛的字符数组.

接下来,它将为此字符串动态分配内存.我想我已经正确地编写了它的语法.

当我在我的程序中使用此方法时,它不会读取字符串中的空格后的文本.

Example text: "This is a message"
Run Code Online (Sandbox Code Playgroud)

它只会将"This"读入变量消息,之后不会显示任何文本.

方法三:

wchar_t *message[100];
Run Code Online (Sandbox Code Playgroud)

这将消息定义为包含100个宽字符的数组和指向wchar_t的指针.这种初始化消息的方法很有效.但是,我不确定这是不是正确的方法.因为消息本身指向字符串中的第一个字符.所以,用尺寸初始化它是否正确?

我想更深入地理解它,初始化字符串的正确方法.同样的概念也可以扩展为一串字符.

alk*_*alk 26

神奇的是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");
Run Code Online (Sandbox Code Playgroud)


Fem*_*ref 2

这实际上取决于您想要做什么以及如何使用数据。如果您全局需要它,请务必定义一个静态数组。如果只在方法中需要,则在方法中做同样的事情。如果你想在函数之间传递数据,在更长的生命周期内,malloc内存并使用它。

但是,您的方法 III 是错误的 - 它是一个包含 100 个wchar_t指针的数组。如果你想创建一个100的大wchar_t数组和一个指针,你需要使用:

wchar_t message[100], *message_pointer;
Run Code Online (Sandbox Code Playgroud)

另外,关于术语:您只是在方法 I 中声明了一个变量,您从未为其分配任何内容。