【问题标题】:C: segmentation fault associated with `swprintf`C: 与 `swprintf` 相关的分段错误
【发布时间】:2017-07-23 23:10:01
【问题描述】:

调用swprintfchar转换为wchar后,调用循环会触发分段错误;循环头中的语句在循环上下文之外可以正常工作。根据返回值(3,which is the number of characters written to the output buffer up to the terminating null character),swprintf 命令成功,这一事实可以通过删除循环的行来确认,以防止分段错误。然而,之后(或之前)调用的 forwhile 循环会产生分段错误。这个问题似乎可以通过将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,而不是 voidgcc 编译器应该警告你这个问题

标签: c segmentation-fault


【解决方案1】:

这个

  wchar_t* string_w;

还有这个

  swprintf(string_w, 4, L"%hs", string);

不使string_w 指向有效内存是一个问题的根源。您需要在使用之前正确初始化string_w,例如

  wchar_t* string_w = malloc(SOME_PROPER_SIZE);

【讨论】:

  • 谢谢你们俩。
【解决方案2】:

你需要分配string_w指向的空间;事实上,它是一个不指向任何地方的指针。

【讨论】:

  • 谢谢你们俩。
猜你喜欢
  • 2019-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多