哪种方法对初始化 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 字符串是正确的?的主要内容,如果未能解决你的问题,请参考以下文章