初学者研究了好久实在解决不了,求指点迷津!!!
时间:2010-08-05
来源:互联网
目的:实现从一段存有字符串的内存中,每次读取N个字符,但这段字符串不是存在数组中。
不能用数组下标的方式读取,因为数组长度有限,这个文本内容可能很长,放不下。
示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
int main()
{
int fd;
char * buffer;
buffer = (char *) malloc (20000 * sizeof(char));
char tmp[600];
fd=open("/root/test.txt",O_RDONLY);
read(fd,buffer,20000);
close(fd);
char * p = buffer;
for(i=0;i<10;i++)
{
strncpy(tmp,buffer,600);
printf("tmp is:%s\n",tmp);
p=p+(i*600);
}
free(buffer);
}
报错内容:
i=0的时候是正常的,执行了p+(i*600);以后就出问题了,使用memcpy也不行,搞好久,真不知道这是为什么。。。。。。。
指针为什么不能移动??????
下面是错误内容:
*** glibc detected *** ./testtmp0: munmap_chunk(): invalid pointer: 0x0804b0d0 ***
======= Backtrace: =========
/lib/libc.so.6[0xb7ef6654]
/lib/libc.so.6[0xb7ef7639]
./testtmp0[0x80485f8]
/lib/libc.so.6(__libc_start_main+0xe5)[0xb7ea0705]
./testtmp0[0x80484c1]
======= Memory map: ========
08048000-08049000 r-xp 00000000 08:02 12315 /root/test/testtmp0
08049000-0804a000 r--p 00000000 08:02 12315 /root/test/testtmp0
0804a000-0804b000 rw-p 00001000 08:02 12315 /root/test/testtmp0
0804b000-0806c000 rw-p 0804b000 00:00 0 [heap]
b7e89000-b7e8a000 rw-p b7e89000 00:00 0
b7e8a000-b7fdf000 r-xp 00000000 08:02 113139 /lib/libc-2.9.so
b7fdf000-b7fe0000 ---p 00155000 08:02 113139 /lib/libc-2.9.so
b7fe0000-b7fe2000 r--p 00155000 08:02 113139 /lib/libc-2.9.so
b7fe2000-b7fe3000 rw-p 00157000 08:02 113139 /lib/libc-2.9.so
b7fe3000-b7fe6000 rw-p b7fe3000 00:00 0
b7fff000-b800c000 r-xp 00000000 08:02 113251 /lib/libgcc_s.so.1
b800c000-b800d000 r--p 0000c000 08:02 113251 /lib/libgcc_s.so.1
b800d000-b800e000 rw-p 0000d000 08:02 113251 /lib/libgcc_s.so.1
b800e000-b8010000 rw-p b800e000 00:00 0
b8010000-b802e000 r-xp 00000000 08:02 113132 /lib/ld-2.9.so
b802e000-b802f000 r--p 0001d000 08:02 113132 /lib/ld-2.9.so
b802f000-b8030000 rw-p 0001e000 08:02 113132 /lib/ld-2.9.so
bfd1a000-bfd2f000 rw-p bffeb000 00:00 0 [stack]
ffffe000-fffff000 r-xp 00000000 00:00 0 [vdso]
已放弃
作者: yyangh 发布时间: 2010-08-05
作者: hellioncu 发布时间: 2010-08-05
作者: hellioncu 发布时间: 2010-08-05
这个不能等于p++之类的移动指针吗?那要如何才能把指针向后移600位呢?
作者: yyangh 发布时间: 2010-08-05
这个不能等于p++之类的移动指针吗?那要如何才能把指针向后移600位呢?
yyangh 发表于 2010-08-05 10:13
p += 600
作者: hellioncu 发布时间: 2010-08-05
hellioncu 发表于 2010-08-05 10:13
嗯,这个是。不过我使用memcpy也不行呢
作者: yyangh 发布时间: 2010-08-05
hellioncu 发表于 2010-08-05 10:14
非常感谢这位大哥提醒,我改成p=p+600,可以打印出来了,但仍然报错,好像只要指针一动,就会报错。
*** glibc detected *** ./testtmp0: munmap_chunk(): invalid pointer: 0x0804b0d0 ***
======= Backtrace: =========
/lib/libc.so.6[0xb7ef6654]
/lib/libc.so.6[0xb7ef7639]
./testtmp0[0x80485f8]
/lib/libc.so.6(__libc_start_main+0xe5)[0xb7ea0705]
./testtmp0[0x80484c1]
======= Memory map: ========
08048000-08049000 r-xp 00000000 08:02 12315 /root/test/testtmp0
08049000-0804a000 r--p 00000000 08:02 12315 /root/test/testtmp0
0804a000-0804b000 rw-p 00001000 08:02 12315 /root/test/testtmp0
0804b000-0806c000 rw-p 0804b000 00:00 0 [heap]
b7e89000-b7e8a000 rw-p b7e89000 00:00 0
b7e8a000-b7fdf000 r-xp 00000000 08:02 113139 /lib/libc-2.9.so
b7fdf000-b7fe0000 ---p 00155000 08:02 113139 /lib/libc-2.9.so
b7fe0000-b7fe2000 r--p 00155000 08:02 113139 /lib/libc-2.9.so
b7fe2000-b7fe3000 rw-p 00157000 08:02 113139 /lib/libc-2.9.so
b7fe3000-b7fe6000 rw-p b7fe3000 00:00 0
b7fff000-b800c000 r-xp 00000000 08:02 113251 /lib/libgcc_s.so.1
b800c000-b800d000 r--p 0000c000 08:02 113251 /lib/libgcc_s.so.1
b800d000-b800e000 rw-p 0000d000 08:02 113251 /lib/libgcc_s.so.1
b800e000-b8010000 rw-p b800e000 00:00 0
b8010000-b802e000 r-xp 00000000 08:02 113132 /lib/ld-2.9.so
b802e000-b802f000 r--p 0001d000 08:02 113132 /lib/ld-2.9.so
b802f000-b8030000 rw-p 0001e000 08:02 113132 /lib/ld-2.9.so
bfd1a000-bfd2f000 rw-p bffeb000 00:00 0 [stack]
ffffe000-fffff000 r-xp 00000000 00:00 0 [vdso]
已放弃
作者: yyangh 发布时间: 2010-08-05
一。 strncpy(tmp,buffer,600); 每次都cp的是同一个位置的600个字节。buffer一直没变。
二。 strncpy(tmp,buffer,600); tmp中有600个字符,没地方放'\0'了。直接读会出段错误。
改为:
- strncpy(tmp, p,600);
- tmp[599] = '\0';
作者: zhangsuozhu 发布时间: 2010-08-05
yyangh 发表于 2010-08-05 10:14
真巧memcpy未尾也不加'\0'

作者: zhangsuozhu 发布时间: 2010-08-05
这个成了第一次到了+600位置,第二次就到了+1800了吧?
另外借地方问一下:malloc分配的地址能保证是连续的吗?
作者: lsstarboy 发布时间: 2010-08-05
同意。应为 p += 600;
是连续的。
作者: zhangsuozhu 发布时间: 2010-08-05
二。 strncpy( ...
zhangsuozhu 发表于 2010-08-05 10:31
这才是关键,你那个p变量一直是个废的游标指针
作者: jimmyixy 发布时间: 2010-08-05
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28