+ -
当前位置:首页 → 问答吧 → 初学者研究了好久实在解决不了,求指点迷津!!!

初学者研究了好久实在解决不了,求指点迷津!!!

时间:2010-08-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]
已放弃

作者: yyangh   发布时间: 2010-08-05

p+(i*600);不会影响p的值

作者: hellioncu   发布时间: 2010-08-05

strncpy末尾不一定给你加'\0'

作者: hellioncu   发布时间: 2010-08-05

回复 hellioncu


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

作者: yyangh   发布时间: 2010-08-05



QUOTE:
回复  hellioncu


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




    p += 600

作者: hellioncu   发布时间: 2010-08-05



QUOTE:
strncpy末尾不一定给你加'\0'
hellioncu 发表于 2010-08-05 10:13




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

作者: yyangh   发布时间: 2010-08-05



QUOTE:
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]
已放弃

作者: yyangh   发布时间: 2010-08-05

本帖最后由 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';
复制代码

作者: zhangsuozhu   发布时间: 2010-08-05



QUOTE:
嗯,这个是。不过我使用memcpy也不行呢
yyangh 发表于 2010-08-05 10:14




    真巧memcpy未尾也不加'\0'

作者: zhangsuozhu   发布时间: 2010-08-05



QUOTE:
p=p+(i*600);

这个成了第一次到了+600位置,第二次就到了+1800了吧?

另外借地方问一下:malloc分配的地址能保证是连续的吗?

作者: lsstarboy   发布时间: 2010-08-05

回复 lsstarboy


    同意。应为 p += 600;

是连续的。

作者: zhangsuozhu   发布时间: 2010-08-05



QUOTE:
一。  strncpy(tmp,buffer,600);   每次都cp的是同一个位置的600个字节。buffer一直没变。
二。  strncpy( ...
zhangsuozhu 发表于 2010-08-05 10:31




    这才是关键,你那个p变量一直是个废的游标指针

作者: jimmyixy   发布时间: 2010-08-05

相关阅读 更多

热门下载

更多