免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3437 | 回复: 5
打印 上一主题 下一主题

wcsrtombs 段错误问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-11-09 10:34 |只看该作者 |倒序浏览
hello everyone
一段程序中:
        wchar_t                        wcsContentLen_Caption[10];       
        wchar_t                        *test;
       
       
        setlocale(LC_ALL, "zh_CN.gbk");
       
        wcsContentLen_Caption[0] = 0x5185;
        wcsContentLen_Caption[1] = 0x5BB9;
        wcsContentLen_Caption[2] = 0x957F;
        wcsContentLen_Caption[3] = 0x5EA6;
        wcsContentLen_Caption[4] = L'\0';

memset(&state, 0, sizeof(mbstate_t));
wcsrtombs(szContent, (const wchar_t**)&wcsContentLen_Caption, 201, &state);

编译执行,出现讨厌的段错误“segment fault”

最后一句改成
test = wcsContentLen_Caption;
wcsrtombs(szContent, (const wchar_t**)&test, 201, &state);
编译执行,成功了


为什么使用数组的名字不行呢?非要用指针,数组的名称不是可以当作指针来用吗?
高手指点啊,多谢了

[ 本帖最后由 supeiwang 于 2006-11-9 11:08 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2006-11-09 12:01 |只看该作者
>>
>>
>>你的test在开始的时候用的wchar_t    *,后面没有制定具体的空间,也就是个空指针
>>然后使用memset自然会出错(没有内存空间来memset)。加上一个test=????也就是
>>将test指向了该内存空间,自然就可以memset了
>>
>>

论坛徽章:
0
3 [报告]
发表于 2006-11-09 13:24 |只看该作者
谢谢楼上,
不过你看错了,我没有对test进行memset 操作,
我忘写了一个声明,
mbstate_t          state;       

还有那位大虾帮忙啊

论坛徽章:
0
4 [报告]
发表于 2006-11-09 18:37 |只看该作者
原帖由 supeiwang 于 2006-11-9 13:24 发表
谢谢楼上,
不过你看错了,我没有对test进行memset 操作,
我忘写了一个声明,
mbstate_t          state;       

还有那位大虾帮忙啊

>>
>>
>>不好意思,发现自己看错了。不过经你提示以后我发现自己看不懂了,你可以将你的相关程序
>>都贴出来,这样可以细致分析。
>>
>>

论坛徽章:
0
5 [报告]
发表于 2006-11-10 08:45 |只看该作者
测试程序的完整源码

#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <error.h>
#include <wchar.h>
#include <locale.h>

int main()
{
        char                        szContent[201];
        mbstate_t                state;
        wchar_t                        wcsContentLen_Caption[10];       
        wchar_t                        *test;       
       
        setlocale(LC_ALL, "zh_CN.gbk");       

        memset(wcsContentLen_Caption, 0, sizeof(wchar_t)*10);
        wcsContentLen_Caption[0] = 0x5185;
        wcsContentLen_Caption[1] = 0x5BB9;
        wcsContentLen_Caption[2] = 0x957F;
        wcsContentLen_Caption[3] = 0x5EA6;
        wcsContentLen_Caption[4] = L'\0';
       
        memset(szContent, 0, 201*sizeof(char));
        memset(&state, 0, sizeof(mbstate_t));       
       
        wcsrtombs(szContent, (const wchar_t**)&wcsContentLen_Caption, 201, &state);
        //如果把上一行注释掉,把下面两行解开注释,编译执行就没有段错误,正常,
        //test = wcsContentLen_Caption;
        //wcsrtombs(szContent, (const wchar_t**)&test, 201, &state);

        return 0;
       
}

wcsrtombs函数的第二个参数在这里只能接收wcha_t*的地址,如果我使用wchar_t数组名称的地址,可以编译但是执行有段错误,这里我就不明白,数组的名字不是可以当作指针来用吗?

[ 本帖最后由 supeiwang 于 2006-11-10 08:50 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2006-11-16 11:13 |只看该作者
顶起来
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP