11

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

方法一:

wchar_t message[100];

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

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

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

方法二:

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

此方法将首先将变量 message 初始化为指向wchar_t. 它是一个宽字符数组。

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

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

Example text: "This is a message"

它只会将“This”读入变量消息中,之后不会出现任何文本。

方法三:

wchar_t *message[100];

这会将 message 定义为 100 个宽字符的数组和指向wchar_t. 这种初始化消息的方法效果很好。但是,我不确定这是否是正确的方法。因为 message 本身指向字符串中的第一个字符。那么,用大小初始化它,对吗?

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

4

2 回答 2

32

神奇的是encoding-prefix 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");

另见C11 标准的相关部分

于 2013-04-11T15:07:14.533 回答
2

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

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

wchar_t message[100], *message_pointer;

另外,关于术语:你只是在方法 I 中声明一个变量,你从来没有给它分配任何东西。

于 2013-04-11T14:39:55.680 回答