免费注册 查看新帖 |

Chinaunix

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

初学者研究了好久实在解决不了,求指点迷津!!! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-08-05 10:05 |只看该作者 |倒序浏览
本帖最后由 yyangh 于 2010-08-05 10:23 编辑

目的:实现从一段存有字符串的内存中,每次读取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]
已放弃

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
2 [报告]
发表于 2010-08-05 10:11 |只看该作者
p+(i*600);不会影响p的值

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
3 [报告]
发表于 2010-08-05 10:13 |只看该作者
strncpy末尾不一定给你加'\0'

论坛徽章:
0
4 [报告]
发表于 2010-08-05 10:13 |只看该作者
回复 2# hellioncu


   这个不能等于p++之类的移动指针吗?那要如何才能把指针向后移600位呢?

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
5 [报告]
发表于 2010-08-05 10:14 |只看该作者
回复  hellioncu


   这个不能等于p++之类的移动指针吗?那要如何才能把指针向后移600位呢?
yyangh 发表于 2010-08-05 10:13



    p += 600

论坛徽章:
0
6 [报告]
发表于 2010-08-05 10:14 |只看该作者
strncpy末尾不一定给你加'\0'
hellioncu 发表于 2010-08-05 10:13



    嗯,这个是。不过我使用memcpy也不行呢

论坛徽章:
0
7 [报告]
发表于 2010-08-05 10:21 |只看该作者
p += 600
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]
已放弃

论坛徽章:
0
8 [报告]
发表于 2010-08-05 10:31 |只看该作者
本帖最后由 zhangsuozhu 于 2010-08-05 10:35 编辑

一。  strncpy(tmp,buffer,600);   每次都cp的是同一个位置的600个字节。buffer一直没变。
二。  strncpy(tmp,buffer,600); tmp中有600个字符,没地方放'\0'了。直接读会出段错误。

改为:

  1. strncpy(tmp, p,600);
  2. tmp[599] = '\0';
复制代码

论坛徽章:
0
9 [报告]
发表于 2010-08-05 10:32 |只看该作者
嗯,这个是。不过我使用memcpy也不行呢
yyangh 发表于 2010-08-05 10:14



    真巧memcpy未尾也不加'\0'{:3_203:}

论坛徽章:
54
2017金鸡报晓
日期:2017-02-08 10:39:42操作系统版块每日发帖之星
日期:2016-03-08 06:20:00操作系统版块每日发帖之星
日期:2016-03-07 06:20:00操作系统版块每日发帖之星
日期:2016-02-22 06:20:00操作系统版块每日发帖之星
日期:2016-01-29 06:20:00操作系统版块每日发帖之星
日期:2016-01-27 06:20:00操作系统版块每日发帖之星
日期:2016-01-20 06:20:00操作系统版块每日发帖之星
日期:2016-01-06 06:20:0015-16赛季CBA联赛之江苏
日期:2015-12-21 20:00:24操作系统版块每日发帖之星
日期:2015-12-21 06:20:00IT运维版块每日发帖之星
日期:2015-11-17 06:20:002015亚冠之广州恒大
日期:2015-11-12 10:58:02
10 [报告]
发表于 2010-08-05 10:36 |只看该作者
p=p+(i*600);
这个成了第一次到了+600位置,第二次就到了+1800了吧?

另外借地方问一下:malloc分配的地址能保证是连续的吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP