首页 文章

C:与`swprintf`相关的分段故障

提问于
浏览
1

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

  • 3

    这个

    wchar_t* string_w;
    

    还有这个

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

    没有使 string_w 指向有效内存是一个问题的秘诀 . 您需要在使用之前正确初始化 string_w ,例如

    wchar_t* string_w = malloc(SOME_PROPER_SIZE);
    
  • 3

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

相关问题