检测到glibc。/.a.out:free():指针无效

检测到glibc。/.a.out:free():指针无效,c,pointers,malloc,free,C,Pointers,Malloc,Free,问题在于这句话(*person)->name=“name”。这不会将字符串“NAME”复制到变量NAME。相反,它使name指向另一个内存位置(而不是您指定的malloc)。如果您试图释放此内存,您将获得未定义的行为。您需要使用strcpy(或strncpy)将字符串复制到变量name。目前您正在执行malloc(sizeof(4)),这是不正确的。请记住,您需要为字符串分配字符数+1个字符以容纳结尾的空字符,目前您只分配了4个字符,这是不够的,您需要为5个字符分配内存。因此,您需要执行mall



问题在于这句话
(*person)->name=“name”。这不会将字符串
“NAME”
复制到变量
NAME
。相反,它使
name
指向另一个内存位置(而不是您指定的
malloc
)。如果您试图
释放
此内存,您将获得未定义的行为。您需要使用
strcpy
(或
strncpy
)将字符串复制到变量
name
。目前您正在执行malloc(sizeof(4))
,这是不正确的。请记住,您需要为字符串分配字符数+1个字符以容纳结尾的空字符,目前您只分配了4个字符,这是不够的,您需要为5个字符分配内存。因此,您需要执行malloc(sizeof(char)*5)

问题在于此语句
(*person)->name=“name”。这不会将字符串
“NAME”
复制到变量
NAME
。相反,它使
name
指向另一个内存位置(而不是您指定的
malloc
)。如果您试图
释放
此内存,您将获得未定义的行为。您需要使用
strcpy
(或
strncpy
)将字符串复制到变量
name
。目前您正在执行malloc(sizeof(4))
,这是不正确的。请记住,您需要为字符串分配字符数+1个字符以容纳结尾的空字符,目前您只分配了4个字符,这是不够的,您需要为5个字符分配内存。所以你需要做
malloc(sizeof(char)*5)
(*person)->name=(unsigned char)malloc(sizeof(4));(*person)->name=“name”

在这里,您请求内存,然后丢失指向该内存的指针。(你把它指向不是由
malloc
分配的“NAME”),这就是为什么当你尝试
释放
指针时,你会得到一个错误。

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


在这里,您请求内存,然后丢失指向该内存的指针。(您将指针指向“NAME”,它不是由
malloc
分配的)这就是为什么当您尝试
释放指针时会出现错误。

还可以查看calloc:


允许您分配n个指定大小的成员。也许这有助于思考这个问题

还可以看看calloc:


允许您分配n个指定大小的成员。也许这有助于思考这个问题

如果您有一个兼容POSIX的库(如glibc),则可以使用strdup()而不是malloc()+strcpy()。如果您有一个兼容POSIX的库(如glibc),则可以使用strdup()而不是malloc()+strcpy()。
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