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

时间:2017-03-03 18:07:36

标签: c segmentation-fault

调用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声明;如何正确地写出这个陈述,如果陈述不正确,为什么它仍能产生预期的回报价值?

#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 个答案:

答案 0 :(得分:3)

//add textBox to form
myForm.Controls.Add(myTextBox);

//now select the textbox
myTextBox.Select();

//display the form
myForm.ShowDialog();

和这个

  wchar_t* string_w;

不使 swprintf(string_w, 4, L"%hs", string); 指向有效内存是一个问题的处方。您需要在使用前正确初始化string_w,例如

string_w

答案 1 :(得分:3)

您需要分配 userID ObjectID Timestamp seq seqID ======== ========== ===================== 1 52 2016-05-01 19:10:01 1 1 1 52 2016-05-01 19:10:05 2 1 1 52 2016-05-01 19:10:07 3 1 1 52 2016-05-01 19:12:01 1 2 1 52 2016-05-01 19:12:04 2 2 2 54 2016-05-01 19:11:09 1 3 2 54 2016-05-01 19:11:19 2 3 ======== ========== ===================== == == 指向的空间;实际上,它是一个指向任何地方的指针。