【发布时间】:2017-07-23 23:10:01
【问题描述】:
调用swprintf将char转换为wchar后,调用循环会触发分段错误;循环头中的语句在循环上下文之外可以正常工作。根据返回值(3,which is the number of characters written to the output buffer up to the terminating null character),swprintf 命令成功,这一事实可以通过删除循环的行来确认,以防止分段错误。然而,之后(或之前)调用的 for 或 while 循环会产生分段错误。这个问题似乎可以通过将char* string 更改为char string[4] 来解决,暗示指针是问题的根源;但是,鉴于我的用例,我宁愿使用 char 指针而不是 char 数组。奇怪的是,如果循环随着char* 到char string[4] 的变化而被删除,那么就会出现分段错误。因此,一些未定义的行为正在发生,可能是由于格式错误的swprintf 语句;如何正确编写该语句,如果该语句格式错误,为什么它仍然会产生预期的返回值?
#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 进行编译。
【问题讨论】:
-
检查答案。您没有为
wchar_t *string_w指针分配内存 -
main()函数只有几个有效的签名(不管 Visual Basic 允许什么),它们的返回类型都是int,而不是void。gcc编译器应该警告你这个问题
标签: c segmentation-fault