wcstombs段故障

验证码

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(

分段故障

任何想法的赛格故障?

TIA,cateof

--------------解决方案-------------

你试图将一个字符串,它肯定超过4个字符到一个字符数组,可容纳4个字符。 当你不指定“4”为最大尺寸,转换将写入到内存中,它并不拥有或可能被其他变量,内部管理数据,如堆栈或类似的函数返回值。 这将导致赛格故障为你覆盖被压入堆栈的数据(栈增长自上而下)你打电话之前wcstombs

你遇到,因为你做的缓冲区溢出不是空终止转换后的缓冲区,缓冲区的大小也不足以容纳结果。

你可以分配内存动态,因为你不知道提前多少内存要求:

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;

分类:C# 时间:2015-03-15 人气:0
本文关键词: C#中,段故障,核心
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.981 (s). 10 q(s)