wcstombs分段错误

时间:2010-02-17 10:46:02

标签: c segmentation-fault core

此代码

int
main (void)
{
  int i;  
  char pmbbuf[4]; 

  wchar_t *pwchello = L"1234567890123456789012345678901234567890";

  i = wcstombs (pmbbuf, pwchello, wcslen(pwchello)* MB_CUR_MAX + 1);

  printf("%d\n", MB_CUR_MAX);
  printf ("   Characters converted: %u\n", i);
  printf ("   Multibyte character: %s\n\n", pmbbuf);

  return 0;
}

奇怪的是,它编译时没有任何警告。

当我跑./a.out它打印出来 1    转换的字符:40    多字节字符:1234(

分段错误

有关seg故障的任何想法吗?

TIA, cateof

2 个答案:

答案 0 :(得分:3)

您遇到缓冲区溢出,因为转换后没有空终止缓冲区,缓冲区大小也不足以保存结果。

您可以动态分配内存,因为您事先并不知道需要多少内存:

int i;
char pmbbuf*;
wchar_t *pwchello = L"1234567890123456789012345678901234567890";
// this will not write anything, but return the number of bytes in the result
i = wcstombs (0, pwchello, wcslen(pwchello)* MB_CUR_MAX + 1);
//allocate memory - +1 byte for the trailing null, checking for null pointer returned omitted (though needed)
pmbbuf = malloc( i + 1 );
i = wcstombs (pmbbuf, pwchello, wcslen(pwchello)* MB_CUR_MAX + 1);
//put the trailing null
pmbbuf[i] = 0;
//whatever you want to do with the string - print, e-mail, fax, etc.
// don't forget to free memory
free( pmbbuf );
//defensive - to avoid misuse of the pointer 
pmbbuf = 0;

答案 1 :(得分:2)

你试图将一个绝对长于4个字符的字符串放入一个可容纳4个字符的字符数组中。由于您未指定“4”作为最大大小,因此转换将写入其不拥有的内存或可能被其他变量使用的内存,内容保持数据,如堆栈上的函数返回值或类似内容。这会导致seg错误,因为在您调用wcstombs之前,您正在覆盖堆栈上推送的数据(堆栈自上而下增长)。