我正在编写一个程序,我需要初始化一个保存文本的消息缓冲区。我能够使它工作,但我在下面用C语言初始化字符串的各种方式编写,我想了解其中的区别。另外,哪种方法最适合初始化wchar_t / char字符串?
方法I:
wchar_t message[100];
根据我的理解,这将分配一个200字节的内存空间(我认为wchar_t的大小是Windows操作系统上的2字节)。此内存分配是静态的,它将在编译时在可执行文件的.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 :(得分:21)
神奇的是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");
答案 1 :(得分:2)
这实际上取决于您想要做什么以及如何使用数据。如果您需要全局,请务必定义静态数组。如果您只需要在方法中使用它,请在方法中执行相同操作。如果你想在函数之间传递数据,在更长的生命周期内,malloc
内存并使用它。
但是,你的方法III是错误的 - 它是一个包含100个wchar_t
指针的数组。如果要创建100个大wchar_t
数组和指针,则需要使用:
wchar_t message[100], *message_pointer;
另外,关于术语:你只是在方法I中声明变量,你永远不会为它赋予任何东西。