glibc的检测./.a.out:免费():无效的指针 [英] glibc detected ./.a.out: free(): invalid pointer

查看:112
本文介绍了glibc的检测./.a.out:免费():无效的指针的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  typedef结构_PERSON
{
        为size_t年龄;
        无符号字符*名称;
}人;INT的init(人**人)
{
        (*人)=(人*)malloc的(的sizeof(结构_PERSON));
        (*人) - GT;年龄= 1;
        (*人) - GT;名称=(无符号字符*)malloc的(的sizeof(4));
        (*人) - GT; NAME =NAME;        返回0;
}接近无效(人**人)
{
        (*人) - GT;年龄= 0;
        如果((*人) - GT;!NAME = NULL)
        {
                免费((*人) - GT;名);
        }        如果((*人)!= NULL)
        {
                免费((*人));
        }
}INT主(INT ARGC,CHAR *的argv [])
{
        PERSON * P;        初始化(安培; P);        的printf(%d个\\ t%S \\ n,(int)的P->年龄,P->名);        接近(安培; P);        返回0;
}


  1名
*** glibc的检测*** ./a.out:免费():无效的指针:0x000000000040079c ***
=======回溯:=========
/lib/libc.so.6(+0x774b6)[0x7fa9027054b6]
/lib/libc.so.6(cfree+0x73)[0x7fa90270bc83]
./a.out(close+0x3d)[0x400651]
./a.out[0x40069f]
/lib/libc.so.6(__libc_start_main+0xfe)[0x7fa9026acd8e]
./a.out[0x4004f9]...7fa8fc000000-7fa8fc021000 RW-P 00000000 00:00 0
7fa8fc021000-7fa900000000 --- p 00000000 00:00 0
7fa902478000-7fa90248d000 R-XP 00000000 08:12 23068732 /lib/libgcc_s.so.1
7fa90248d000-7fa90268c000 --- p 00015000 08:12 23068732 /lib/libgcc_s.so.1
7fa90268c000-7fa90268d000 - [R - P 00014000 08:12 23068732 /lib/libgcc_s.so.1
7fa90268d000-7fa90268e000 RW-P 00015000 08:12 23068732 /lib/libgcc_s.so.1
7fa90268e000-7fa902808000 R-XP 00000000 08:12 23068970 /lib/libc-2.12.1.so
7fa902808000-7fa902a07000 --- p 0017a000 08:12 23068970 /lib/libc-2.12.1.so
7fa902a07000-7fa902a0b000 - [R - P 00179000 08:12 23068970 /lib/libc-2.12.1.so
7fa902a0b000-7fa902a0c000 RW-P 0017d000 08:12 23068970 /lib/libc-2.12.1.so
7fa902a0c000-7fa902a11000 RW-P 00000000 00:00 0
7fa902a11000-7fa902a31000 R-XP 00000000 08:12 23068966 /lib/ld-2.12.1.so
7fa902c25000-7fa902c28000 RW-P 00000000 00:00 0
7fa902c2e000-7fa902c31000 RW-P 00000000 00:00 0
7fa902c31000-7fa902c32000 - [R - P 00020000 08:12 23068966 /lib/ld-2.12.1.so
7fa902c32000-7fa902c33000 RW-P 00021000 08:12 23068966 /lib/ld-2.12.1.so
7fa902c33000-7fa902c34000 RW-P 00000000 00:00 0
7fff442d5000-7fff442f6000 RW-P 00000000 00:00 0 [堆栈]
7fff44308000-7fff44309000 R-XP 00000000 00:00 0 VDSO]
ffffffffff600000-ffffffffff601000 R-XP 00000000 00:00 0 vsyscall]
中止


解决方案

(*人) - GT;名称=(unsigned char型)的malloc(sizeof的(4)); (*人) - GT; NAME =NAME

在这里,您请求的内存,然后失去了指针指向的内存。 (你点哪个不是由的malloc 分配NAME),这就是为什么当你尝试免费指针你得到一个错误。

typedef struct _PERSON
{
        size_t age;
        unsigned char* name;
}PERSON;

int init(PERSON** person)
{
        (* person) = (PERSON *) malloc(sizeof(struct _PERSON));
        (* person)->age = 1;
        (* person)->name = (unsigned char *) malloc(sizeof(4));
        (* person)->name = "NAME";

        return 0;
}

void close(PERSON** person)
{
        (* person)->age = 0;
        if((* person)->name != NULL)
        {
                free((* person)->name);
        }

        if((* person) != NULL)
        {
                free((* person));
        }
}

int main(int argc, char* argv[])
{
        PERSON* p;

        init(&p);

        printf("%d\t%s\n", (int) p->age, p->name);

        close(&p);

        return 0;
}


1       NAME
*** glibc detected *** ./a.out: free(): invalid pointer: 0x000000000040079c ***
======= Backtrace: =========
/lib/libc.so.6(+0x774b6)[0x7fa9027054b6]
/lib/libc.so.6(cfree+0x73)[0x7fa90270bc83]
./a.out(close+0x3d)[0x400651]
./a.out[0x40069f]
/lib/libc.so.6(__libc_start_main+0xfe)[0x7fa9026acd8e]
./a.out[0x4004f9]

...

7fa8fc000000-7fa8fc021000 rw-p 00000000 00:00 0
7fa8fc021000-7fa900000000 ---p 00000000 00:00 0
7fa902478000-7fa90248d000 r-xp 00000000 08:12 23068732                   /lib/libgcc_s.so.1
7fa90248d000-7fa90268c000 ---p 00015000 08:12 23068732                   /lib/libgcc_s.so.1
7fa90268c000-7fa90268d000 r--p 00014000 08:12 23068732                   /lib/libgcc_s.so.1
7fa90268d000-7fa90268e000 rw-p 00015000 08:12 23068732                   /lib/libgcc_s.so.1
7fa90268e000-7fa902808000 r-xp 00000000 08:12 23068970                   /lib/libc-2.12.1.so
7fa902808000-7fa902a07000 ---p 0017a000 08:12 23068970                   /lib/libc-2.12.1.so
7fa902a07000-7fa902a0b000 r--p 00179000 08:12 23068970                   /lib/libc-2.12.1.so
7fa902a0b000-7fa902a0c000 rw-p 0017d000 08:12 23068970                   /lib/libc-2.12.1.so
7fa902a0c000-7fa902a11000 rw-p 00000000 00:00 0
7fa902a11000-7fa902a31000 r-xp 00000000 08:12 23068966                   /lib/ld-2.12.1.so
7fa902c25000-7fa902c28000 rw-p 00000000 00:00 0
7fa902c2e000-7fa902c31000 rw-p 00000000 00:00 0
7fa902c31000-7fa902c32000 r--p 00020000 08:12 23068966                   /lib/ld-2.12.1.so
7fa902c32000-7fa902c33000 rw-p 00021000 08:12 23068966                   /lib/ld-2.12.1.so
7fa902c33000-7fa902c34000 rw-p 00000000 00:00 0
7fff442d5000-7fff442f6000 rw-p 00000000 00:00 0                          [stack]
7fff44308000-7fff44309000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
Aborted

解决方案

(* person)->name = (unsigned char ) malloc(sizeof(4)); (* person)->name = "NAME"

Here you request the memory and then lose the pointer to that memory. (You point it to "NAME" which wasn't allocated by malloc.) That's why when you try to free the pointer you get an error.

这篇关于glibc的检测./.a.out:免费():无效的指针的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆