使用malloc()和free()函数时出错

时间:2014-04-08 16:32:07

标签: c string malloc

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

这是该计划:

free()

这个错误:

#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;
 }

./程序[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 [stack]     中止

4 个答案:

答案 0 :(得分:1)

此:

char *src,*dest;

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

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

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

答案 1 :(得分:0)

这一行:

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

是否会出错,因为src尚未初始化。 将其初始化为与其需要使用的相关的其他值。

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

如果你传递一个未初始化的指针,你的函数len()将会出错 并且 强制转换malloc()

答案 2 :(得分:0)

当您在第一行中使用malloc时,您会发现带有len()的src大小,但src未初始化。所以你是malloc垃圾。

答案 3 :(得分:0)

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

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

src=malloc(100);

请注意,您不应该投射malloc的结果。