分类: 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当然就有错误了,系统无法确定你的数据段的内存预分配的大小,也就无法确认你的终端点的位置,也就报出了段错误(数据段大小无法确定):