Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2035039
  • 博文数量: 414
  • 博客积分: 10312
  • 博客等级: 上将
  • 技术积分: 4921
  • 用 户 组: 普通用户
  • 注册时间: 2007-10-31 01:49
文章分类

全部博文(414)

文章存档

2011年(1)

2010年(29)

2009年(82)

2008年(301)

2007年(1)

分类: C/C++

2008-02-26 17:04:22

我在转换汉字时候,怎么不能转换呢?
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <iconv.h>

    int main(int argc, char *argv[])
    {
        iconv_t cd = iconv_open("GBK", "UTF-8");
        if (cd == (iconv_t)-1)
        {
            fprintf(stderr, "init fail!");
            return 0;
        }
        char *input = "中国";
        size_t out = 12;

        char *output = (char *)malloc(out);

        size_t len = strlen(input);
        size_t olen = sizeof(output);
        size_t err = iconv(cd, &input, &len, &output, &olen);

        if (err == -1)
        {
            fprintf(stderr, "iconv fail!");
            return 0;
        }
        printf("%s\n", output);
        return 0;
    }


而写成这样就可以:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <iconv.h>

    int main(int argc, char *argv[])
    {
        iconv_t cd = iconv_open("GBK", "UTF-8");
        if (cd == (iconv_t)-1)
        {
            fprintf(stderr, "init fail!");
            return 0;
        }
        char *input = "中国";
        size_t len = strlen(input);
        char output[12];
        char *p = (char *)output;
        size_t olen = sizeof(p);
        size_t err = iconv(cd, &input, &len, &p, &olen);


        if (err == -1)
        {
            fprintf(stderr, "iconv fail!");
            return 0;
        }
        printf("%s\n", output);
        return 0;
    }



为什么下面的可以呢?

答: 因为iconv会改变你传进去的值,iconv后的output已经不是以前的output了。像那个数组,如果传进去的话会发现它会段错误的。

我的答案: 系统调用malloc是在系统的内存堆上进行动态分配数组的一个方法,如果像你的第2个程序中,out指定了12的数组,系统就为其分配了固定大小的内存,但是iconv改变了len的大小,所以使用malloc当然就有错误了,系统无法确定你的数据段的内存预分配的大小,也就无法确认你的终端点的位置,也就报出了段错误(数据段大小无法确定):

阅读(1332) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~