【问题标题】:error when using malloc() and free() function使用 malloc() 和 free() 函数时出错
【发布时间】:2014-05-21 12:01:12
【问题描述】:

我想在没有include <string.h>的情况下创建我自己的strcpy()function。我已经读到,每当我们调用malloc()函数来分配内存时,我们必须释放我们使用free()function分配的内存,但是为什么这个程序给了我一个奇怪的错误,我以前从未见过这种类型的错误,为什么这个程序没有给我确切的目标字符串。

这是程序:

#include <stdio.h>
#include <stdlib.h>

char *my_gets(char *string);
char *coppy(char *dest,char*src);
int len(char *string);

int main (void){
    char *src,*dest;

    src=(char *)malloc(len(src)+1);
    printf("enter string source:");my_gets(src);

    printf("length source=%d\n",len(src));

    dest=(char *)malloc(len(src)+1);
    coppy(dest,src);
    printf("destination string:%s\n",dest);

    free(src);
    free(dest);
    return 0;
}

char *my_gets(char *string){
   char ch;

   while((*string=getchar()) !='\n'){
        string++;
   }
   if(string[len(string)-1]=='\n'){
    string[len(string)-1]='\0';
    }
    return string;
 }

char *coppy(char *dest,char *src){
   while(*src!='\0'){
    *dest++=*src++;
   }
   *dest='\0';
   return dest;
 }

int len(char *string){
   int i=0;

   while(*string!='\0'){
    string++;
    i++;
   }
   return i;
 }

这是错误:

enter string source:i want to create my own strcpy function but i got an a strange error
length source=67
destination string:i want to crI
*** Error in `./program': free(): invalid next size (normal): 0x086b4018 ***
======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6(+0x767e2)[0xb76457e2]
/lib/i386-linux-gnu/libc.so.6(+0x77530)[0xb7646530]
./program[0x804855f]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf5)[0xb75e8935]

./program[0x80483d1] ======= 内存映射:======== 08048000-08049000 r-xp 00000000 08:01 4330274 /home/harianja/LUNDU/Lundu/coding/Cprogram/program 08049000-0804a000 r--p 00000000 08:01 4330274 /home/harianja/LUNDU/Lundu/coding/Cprogram/program
0804a000-0804b000 rw-p 00001000 08:01 4330274 /home/harianja/LUNDU/Lundu/coding/Cprogram/program
086b4000-086d5000 rw-p 00000000 00:00 0 [堆]
b7593000-b75ae000 r-xp 00000000 08:01 4195166 /lib/i386-linux-gnu/libgcc_s.so.1
b75ae000-b75af000 r--p 0001a000 08:01 4195166 /lib/i386-linux-gnu/libgcc_s.so.1
b75af000-b75b0000 rw-p 0001b000 08:01 4195166 /lib/i386-linux-gnu/libgcc_s.so.1
b75ce000-b75cf000 rw-p 00000000 00:00 0
b75cf000-b777d000 r-xp 00000000 08:01 4208177 /lib/i386-linux-gnu/libc-2.17.so
b777d000-b777f000 r--p 001ae000 08:01 4208177 /lib/i386-linux-gnu/libc-2.17.so
b777f000-b7780000 rw-p 001b0000 08:01 4208177 /lib/i386-linux-gnu/libc-2.17.so
b7780000-b7783000 rw-p 00000000 00:00 0
b779e000-b77a3000 rw-p 00000000 00:00 0
b77a3000-b77a4000 r-xp 00000000 00:00 0 [vdso]
b77a4000-b77c4000 r-xp 00000000 08:01 4208178 /lib/i386-linux-gnu/ld-2.17.so
b77c4000-b77c5000 r--p 0001f000 08:01 4208178 /lib/i386-linux-gnu/ld-2.17.so b77c5000-b77c6000 rw-p 00020000 08:01 4208178 /lib/i386-linux-gnu/ld-2.17.so bf863000-bf884000 rw-p 00000000 00:00 0 [堆栈] 中止

【问题讨论】:

标签: c string malloc


【解决方案1】:

这个:

char *src,*dest;

src=(char *)malloc(len(src)+1);

是未定义的行为,src 是一个未初始化的指针,您不能将其传递给 len(),因为它将从中读取。

另外,len()strlen() 的重新实现,但也许你知道这一点。

【讨论】:

    【解决方案2】:

    当您在第一行进行 malloc 时,您会使用 len() 找到 src 大小,但 src 未初始化。所以你malloc垃圾。

    【讨论】:

      【解决方案3】:
      char *src,*dest;
      src=(char *)malloc(len(src)+1);
      

      您忘记添加-fclairvoyance 编译器选项。请注意,千里眼仍处于测试阶段,不能保证产生正确的结果。要解决此限制,请尝试预先估计最大字符串长度:

      src=malloc(100);
      

      注意你不应该转换malloc的结果。

      【讨论】:

        【解决方案4】:

        这一行:

        src=(char *)malloc(len(src)+1); 
        

        会报错,因为 src 还没有被初始化。 将其初始化为与它需要用于什么相关的其他值。

        src=malloc(100); //for lack of any better value, used 100  
        

        如果你传递一个未初始化的指针,你的函数 len() 将会出错。
        并且不要投回malloc()

        【讨论】:

          猜你喜欢
          • 2017-04-03
          • 2023-04-07
          • 1970-01-01
          • 1970-01-01
          • 2012-06-10
          • 1970-01-01
          • 2011-12-19
          • 2019-11-15
          • 2012-04-29
          相关资源
          最近更新 更多