问个关于指针的问题

Soulic 2011-03-20 10:51:56
在项目中遇到的关于指针的问题
方式一:
int data_read(FIEL *fp, int pos, int length, char **buff)

int i;
char *data;

data = (char*) malloc(length);
if (NULL == data)
{
printf("%s: %d: %s() Malloc error.\n", __FILE__, __LINE__, __FUNCTION__);
return (0);
}

printf("Position %p.\n", data);
for (i = 0; i < length; i++) {
data[i] = fgetc(fp);
}

*buff = data;

return (1);
}

int main()
{
char *data;
FILE *fp;
int len;
int pos;

// ...

data_read(fp, pos, length, &data);
printf("Position %p.\n", data);
if (NULL == data)
{
exit(0);
}
// ...
free(data);
}


方式二:

char *data_read(FILE *fp, int pos, int length) {
int i;
char *data;

data = (char*) malloc(length);
if (NULL == data)
{
printf("%s: %d: %s() Malloc error.\n", __FILE__, __LINE__, __FUNCTION__);
return (0);
}

printf("Position %p.\n", data);
for (i = 0; i < length; i++) {
data[i] = fgetc(fp);
}

return (data);
}

int main()
{
char *data;
FILE *fp;
int len;
int pos;

// ...

data = data_read(fp, pos, length);
printf("Position %p.\n", data);
if (NULL == data)
{
exit(0);
}
// ...
free(data);
}


按说这两中方式应该都是可以的,不过在我的项目中,第二种方式会在free的时候出错:***glibc detected*** free(): invalid next size (fast),而第一种方式不会,而且在data_read函数和main函数中打印出来的指针的值是相同的,有人知道是什么原因吗?
...全文
240 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
Soulic 2011-03-29
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 best_02 的回复:]

检查下free前有没有越界的copy动作。
[/Quote]
你指的是把data copy到别的地方,还是向data copy内容,不管是哪一种,都没有这样的操作
bEst_02 2011-03-29
  • 打赏
  • 举报
回复
检查下free前有没有越界的copy动作。
Soulic 2011-03-29
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 ttssrs 的回复:]

调试一下,看看把data赋给*buff时data的值

引用 13 楼 bhdgx 的回复:
都说是字符串结束符的问题,可是两种方式都没有字符串结束符啊,为什么就只有一种会出错
[/Quote]
第二种情况会出错,在read_data中打印data的值和在main打印data的值是相同的,在free之前打印data是不变的
Soulic 2011-03-29
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 libinfei8848 的回复:]

在此代码中,如果不以null作为字符串结束,那么出现问题可能是随机的
[/Quote]
能不能解释下
Soulic 2011-03-21
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 e3399 的回复:]

方式二中
data = (char*) malloc(length);
改成
data = (char*) malloc(length + 1);
[/Quote]
似乎明白了点,是不是要有个字符串结束符才行。但是这好像也不是必须的啊,读取的数据不一定是要当字符串来用。
libinfei8848 2011-03-21
  • 打赏
  • 举报
回复
在此代码中,如果不以null作为字符串结束,那么出现问题可能是随机的
ttssrs 2011-03-21
  • 打赏
  • 举报
回复
调试一下,看看把data赋给*buff时data的值

[Quote=引用 13 楼 bhdgx 的回复:]
都说是字符串结束符的问题,可是两种方式都没有字符串结束符啊,为什么就只有一种会出错
[/Quote]
Soulic 2011-03-21
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 pengzhixi 的回复:]

而是你在free前肯定修改了data,free前你再打印下data包含的地址吧
[/Quote]
可以肯定的是在free前是没有修改的,也有在free前打印过,和前面的打印是相同的
sculfm 2011-03-21
  • 打赏
  • 举报
回复
不要返回局部变量的指针或引用,
你这种情况是大家常犯的错误
pengzhixi 2011-03-21
  • 打赏
  • 举报
回复
而是你在free前肯定修改了data,free前你再打印下data包含的地址吧
aimerjing 2011-03-21
  • 打赏
  • 举报
回复
我是来学习的
harord_lin 2011-03-21
  • 打赏
  • 举报
回复
另外,这里不需要在data后面加入NULL。具体原因是malloc和free会自动记录分配的地址长度。除非你在使用时改变data地址,否则free不会越界。
harord_lin 2011-03-21
  • 打赏
  • 举报
回复
VS2010 + win7 系统下测试没有你说的问题。
怀疑是你在read_data返回后的操作中改变了data指针的地址。
Soulic 2011-03-21
  • 打赏
  • 举报
回复
都说是字符串结束符的问题,可是两种方式都没有字符串结束符啊,为什么就只有一种会出错
luxihua 2011-03-21
  • 打赏
  • 举报
回复
一般出这个问题是因为字符串的最后没有结束符
赵4老师 2011-03-21
  • 打赏
  • 举报
回复
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编并单步执行一遍不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”
heartgoon2010 2011-03-21
  • 打赏
  • 举报
回复
C风格字符串是一个以null结尾的字符数组,语句"data = (char*) malloc(length);"只是分配了一个长度为length的内存空间,由data这个指针指向。如果我们要使用data作为一个字符串的话需要手动添加一个null结束符,否则结果不可预测。这就是你的问题出现的原因
贪食蛇男 2011-03-21
  • 打赏
  • 举报
回复
const char* a = "ASDFASDF";
char* tmp = (char*)malloc(strlen(a) + 1);
strcpy(tmp, a);
jernymy 2011-03-21
  • 打赏
  • 举报
回复
使用VC6.0和
linux的gcc version 4.1.2 20070626 (Red Hat 4.1.2-14)
编译器都没有遇到lz的问题
hellowordandhello 2011-03-20
  • 打赏
  • 举报
回复
是你少加了一个字节!!!
加载更多回复(5)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧