QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 763|回复: 3

两个小问题,请教高人

[复制链接]
发表于 2004-2-25 21:34:49 | 显示全部楼层 |阅读模式
1:
一段从文件中读取数据的代码,文件由一串字符组成,没有换行:

char *data;
FILE *f;

f = fopen("a.dat", "r");
data = (char *)malloc(100);   /*实际的程序中是由变量的值决定需要的空间*/
fread(data, sizeof(char), 100, f);
fclose(f);

用gdb看data的值时,有时会出现多出几个字符的现象,因为data在后面的使用中是作为字符数组来使用的,绝对访问不到data[0]--data[99]以外的值,所以程序运行起来看不出什么异常。但总是不明白为什么会这样呢?

2:编译好的程序,如果这样运行
./program
就没有问题,但如果在别的路径下,用绝对路径来运行,就会segametation fault,这是为何?

请高手不吝赐教,多谢!
发表于 2004-2-25 22:08:59 | 显示全部楼层
1. 不详:),不过题外话,你该检查一下 malloc  的返回~~,小心还是没错的。

2. 你的 FILE *f = fopen ("a.dat", "r"); 没有检查 fopen 的返回,所以你在别的路径下运行程序
可能没有找到 a.dat 文件,造成 fopen 返回 NULL, 而你又没有检查 fopen 返回,所以
又造成 fread 读取出错~~
j建议用 **argv 来传递需要读取的数据文件名 ~~
回复

使用道具 举报

发表于 2004-2-25 22:45:42 | 显示全部楼层
答问题一:
由于C语言中,一个字符串的是以0(ASC II值)作为结尾的,malloc之后,申请出来的内存里面的内容是随机的,gdb显示的时候是从指针所指的字节开始直至第一个0
回复

使用道具 举报

 楼主| 发表于 2004-2-26 00:42:38 | 显示全部楼层
多谢上面两位,第一个问题我在LinuxSir上得到的回复与默难兄讲的基本一致,gdb显示的时候是将其作为字符串对待的,所以才可能多出来,我想应该就是这样了。
第二个问题确实有这种可能,等我将文件复制到到另一个路径下,在那里运行一下试试。
多谢!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-8 22:45 , Processed in 0.056225 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表