在调用 swprintf
将 char
转换为 wchar
之后,调用循环会触发分段错误;循环头中的语句在循环上下文之外工作正常 . swprintf
命令基于返回值(3,which is the number of characters written to the output buffer up to the terminating null character)成功,这一事实可以通过删除循环的行来确认,以防止分段错误 . 然而,之后(或之前)调用的 for
或 while
循环会产生分段错误 . 这个问题似乎是通过将 char* string
更改为 char string[4]
来解决的,这意味着将指针作为问题的来源;但是,考虑到我的用例,我宁愿使用char指针而不是char数组 . 奇怪的是,如果循环被移除伴随着 char*
变为 char string[4]
,则会出现分段错误 . 因此,一些未定义的行为正在发生,可能是由于格式错误的 swprintf
声明;如何正确地写出这个陈述,如果陈述不正确,为什么它仍然会产生预期的回报 Value 呢?
#include <stdio.h>
#include <wchar.h>
void main() {
char* string = "ABC";
//char string[4] = "ABC";
wchar_t* string_w;
swprintf(string_w, 4, L"%hs", string);
int retval = swprintf(string_w, 4, L"%hs", string);
printf("string: %ls\nreturn value: %d\n",string_w, retval);
for (int i = 0; i < 2; i++) {
// do nothing
}
}
注意:我正在使用 gcc
编译:( Debian 6.2.1-5)6.2.1 20161124 .
2 回答
这个
还有这个
没有使
string_w
指向有效内存是一个问题的秘诀 . 您需要在使用之前正确初始化string_w
,例如您需要分配
string_w
指向的空间;实际上,它是一个指针,不指向任何地方 .