指针 与 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还是很有用的,该理会的还是要理会~
后一篇:不安全的printf之佐证