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

Posted

技术标签:

【中文标题】哪种方法对初始化 wchar_t 字符串是正确的?【英文标题】:Which method is correct for Initializing a wchar_t string? 【发布时间】:2013-04-03 19:30:35 【问题描述】:

我正在编写一个程序,我需要初始化一个用于保存文本的消息缓冲区。我能够使它工作,但是我正在编写以下用于初始化 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”读入变量message,之后不会有任何文本。

方法三:

wchar_t *message[100];

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

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

【问题讨论】:

您没有显示初始化字符串的代码,所以我们无法真正帮助您,只能说方法 III 是错误的。除了变量声明之外,你能显示初始化吗?除此之外,您不需要在 C 中强制转换 malloc 的返回值(方法 II),并且当它实际上是一个数组(方法 I)时,您就 message 是一个指针做出了一些不稳定的陈述。 您的第三个message 方法是100 wchar_t 指针。不确定这是否是您的意图,但您的描述显然与该声明不符。同样,了解wcscmp()wcscpy() 和其他wchar_t 函数家族成员可能对您有帮助。这里没有魔法。 ***.com/questions/3112407/wchar-t-pointer的可能重复 【参考方案1】:

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

另请参阅related part of the C11 Standard。

【讨论】:

【参考方案2】:

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

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

wchar_t message[100], *message_pointer;

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

【讨论】:

以上是关于哪种方法对初始化 wchar_t 字符串是正确的?的主要内容,如果未能解决你的问题,请参考以下文章

使用字符串初始化 wchar_t[]

不推荐从字符串 const 转换。到 wchar_t*

wchar_t* 到 char* 的转换问题

比较 2 个 wchar_t 数组

如何初始化 wchar_t 变量?

asprintf 有 wchar_t 版本吗?