免费注册 查看新帖 |

Chinaunix

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

奇怪的问题:关于gcc [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-01-05 03:33 |只看该作者 |倒序浏览

  1. #include <stdio.h>;
  2. #include <stdlib.h>;

  3. int main(int argc, char **argv)
  4. {
  5.     char s[]="2229";//最奇怪的就是这里
  6.     FILE           *fp;
  7.     unsigned int    start, end, index_num, i, ip, startip, endip, fpos;
  8.     fp = fopen("/home/assiss/data/QQWry.Dat", "rb");
  9.     fread(&start, 4, 1, fp);
  10.     fread(&end, 4, 1, fp);
  11.     index_num = (end - start) / 7 + 1;

  12.     fseek(fp, start, SEEK_SET);

  13.     for (i = 0; i < index_num; i++)
  14.     {
  15.         fseek(fp, start + i * 7, SEEK_SET);
  16.         fread(&startip, 4, 1, fp);
  17.         fread(&fpos, 3, 1, fp);

  18.         fseek(fp, fpos, SEEK_SET);
  19.         printf("%d\n",fread(&endip, 4, 1, fp));//如果改变上面的s[]="",那么这里会有质的变化
  20.     }
  21.     fclose(fp);
  22.     return 0;
  23. }
复制代码

请大家下载
http://96hk.y365.com/soft/qqwry.rar
或者已经安装了GAIM的就直接用它自带的试试。
请大家帮我测试这个程序, 我快疯掉了。
我觉得这可能不是程序问题,而是系统/GCC的问题……

我描述一下:
1.
char s[]="2229";//长度>;=4
那么
printf("%d\n",fread(&endip, 4, 1, fp));
将会打印0.即表示什么都没读。

2.
char s[]="229";//长度<=3
那么
printf("%d\n",fread(&endip, 4, 1, fp));
将会打印1.即表示读到了。

我花了6个小时,没弄明白……
希望是因为我粗心的错,但我现在实在看不出来了,已经要崩溃了……

系统是FreeBSD5.3R,光盘刻录的,没有make world.没有make kernel.
gcc是3.4.2.随系统带的。没有升级。
port装了不少,但应该跟这个没关系吧?
外来软件只编译了fltk2.0,我想它应该没病毒吧?

论坛徽章:
0
2 [报告]
发表于 2005-01-05 09:02 |只看该作者

奇怪的问题:关于gcc

刚醒,就迫不及待地跑来看……
帮我测试一下吧

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
3 [报告]
发表于 2005-01-05 09:06 |只看该作者

奇怪的问题:关于gcc

你的文件格式是啥样子的啊?

论坛徽章:
0
4 [报告]
发表于 2005-01-05 09:21 |只看该作者

奇怪的问题:关于gcc

你的s好像在程序中根本就没有用到...

论坛徽章:
0
5 [报告]
发表于 2005-01-05 09:44 |只看该作者

奇怪的问题:关于gcc

我在我的机器上测试,没有遇到你提到的问题,s[]的长度不影响文件的读写!这里不存在溢出问题

论坛徽章:
0
6 [报告]
发表于 2005-01-05 09:52 |只看该作者

奇怪的问题:关于gcc

对啊,s[]没见你用啊。还有你怎么知道那个dat文件该怎么读的,怎么能知道它的格式?

论坛徽章:
0
7 [报告]
发表于 2005-01-05 09:53 |只看该作者

奇怪的问题:关于gcc

fread(&fpos, 3, 1, fp);
改为
fread(&fpos, 4, 1, fp);
试一试

论坛徽章:
0
8 [报告]
发表于 2005-01-05 10:13 |只看该作者

奇怪的问题:关于gcc

我把楼主的程序fread的地方加了错误检测,结果发现包含在printf里的那个fread第一次执行就到了eof了,怎么回事?

论坛徽章:
0
9 [报告]
发表于 2005-01-05 10:59 |只看该作者

奇怪的问题:关于gcc

先加全所有的判定阿瑟,,看看在哪出错了先

论坛徽章:
0
10 [报告]
发表于 2005-01-05 12:09 |只看该作者

奇怪的问题:关于gcc

原帖由 "思一克" 发表:
fread(&fpos, 3, 1, fp);
改为
fread(&fpos, 4, 1, fp);
试一试

终于明白了。看来疲劳的时候睡觉是最好的办法。呵呵。
思一克的话与FREEBSD论坛里的RUF说的
由于fpos没有初始化

让我彻底明白我错在哪了。

至于大家对没有使用s的疑问,ruf也解释了
那么为什么char[4]和char[3]对结果有影响呢?因为在局部变量里char*和char[]的实现是不一样的,char[]的所有内容会存储在堆栈里,这会影响它之后定义的局部变量的位置和缺省值,在你的机器里,它导致了不同的fpos初始值。


经过这次惨痛的教训,估计以后我不会再忽视初始值的作用了。

PS:本来程序不是这样的,但我为了找错误原因,大大简化了程序,结果脑筋就转不过弯来,认定简化的程序肯定没错。唉。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP