加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

指针 与 int的转换 (warning: cast to pointer from integer of different size)

(2011-04-27 16:23:18)
标签:

指针

int

转换

it

分类: 编程

以前在32位上测试这两个互相转换时没什么问题的,今天碰到了一件事情,发现在64位机器上不尽然~

事情是这样的:
为了测试errno与strerror这两个东西,写了一段程序

void testfunc()
{
char s[80];
FILE* fl = fopen("abc.txt", "rw");
FILE* fl2 = fopen("abc2.txt", "w");
if(!fl || !fl2)
{
char errorstr[10];
sprintf(errorstr, "%d", errno);
fputs(errorstr, stderr);
char *str_error = (char*)(strerror(errno));
printf("%s\n", str_error);
//fputs(strerror(errno), stderr);
return;
}
fputs("writing to abc2.txt...\n", stdout);
while(fgets(s,80,fl))
{
fputs(s,fl2);
}
}

在使用strerror函数的时候,以为它的声明是包含在<errno.h>中,没有include它实际所在的文件<string.h>
结果导致函数的隐式声明:int strerror(int );跟它的实际类型相比,返回值由char*变为了int,其它都一样。
编译的时候出现:warning: cast to pointer from integer of different size
没理它,继续链接,运行,出现:Segmentation fault (core dumped)
调试的时候发现printf("%s\n", str_error);这句话出错的,str_error的value非法的。当时很纳闷儿,后来得知
是char* 与 int的转化关系——之前出现的warnning就是说的这个。那为什么先前用的int与char*(指针)转化都没问题
呢?难道本机二者的长度不一样?写了一个sizeof的测试程序,发现果然,int的长度为4,char*的长度为8,难怪!
为了验证我的推断,把这个不规则的程序在32位机器上运行,发现运行时正常的:
$ ./a.exe
2No such file or directory
ps.本次的教训是:某些warnning还是很有用的,该理会的还是要理会~

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有