在 C 中的 malloc 之后调用 free() 时出现无效指针错误

Kus*_*dal 1 c free pointers

我正在用 C 进行非常基本的动态分配实践,但遇到了这个问题:当我尝试free()使用 返回的指针进行调用时malloc(),在运行时出现无效指针错误。

当我free()从代码中删除时,它工作正常。我正在使用的指针在返回后无论如何都不会被修改malloc(强制转换除外)。所以这排除了我在网上找到的一些建议。下面是我的代码:

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

int main() {
        int num = 0;
        //printf("Enter a number: ");
        //scanf("%d", &num);
        char* p = (char*)malloc(16*sizeof(char));
        printf("%p", p);
        if(p) {
                p = "mark";
                printf("\n%s\n", p);
                free(p); //when removed no error
        }
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

以下是错误消息:

0xa26010
mark
*** Error in `./a.out': free(): invalid pointer: 0x00000000004006b7 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x777e5)[0x7fa968aed7e5]
/lib/x86_64-linux-gnu/libc.so.6(+0x8037a)[0x7fa968af637a]
/lib/x86_64-linux-gnu/libc.so.6(cfree+0x4c)[0x7fa968afa53c]
./a.out[0x40061a]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0)[0x7fa968a96830]
./a.out[0x4004e9]
======= Memory map: ========
00400000-00401000 r-xp 00000000 08:03 6815746                            /home/kushal/Documents/GATE/prac_C/a.out
00600000-00601000 r--p 00000000 08:03 6815746                            /home/kushal/Documents/GATE/prac_C/a.out
00601000-00602000 rw-p 00001000 08:03 6815746                            /home/kushal/Documents/GATE/prac_C/a.out
00a26000-00a47000 rw-p 00000000 00:00 0                                  [heap]
7fa964000000-7fa964021000 rw-p 00000000 00:00 0 
7fa964021000-7fa968000000 ---p 00000000 00:00 0 
7fa968860000-7fa968876000 r-xp 00000000 08:03 39719295                   /lib/x86_64-linux-gnu/libgcc_s.so.1
7fa968876000-7fa968a75000 ---p 00016000 08:03 39719295                   /lib/x86_64-linux-gnu/libgcc_s.so.1
7fa968a75000-7fa968a76000 rw-p 00015000 08:03 39719295                   /lib/x86_64-linux-gnu/libgcc_s.so.1
7fa968a76000-7fa968c36000 r-xp 00000000 08:03 39714902                   /lib/x86_64-linux-gnu/libc-2.23.so
7fa968c36000-7fa968e36000 ---p 001c0000 08:03 39714902                   /lib/x86_64-linux-gnu/libc-2.23.so
7fa968e36000-7fa968e3a000 r--p 001c0000 08:03 39714902                   /lib/x86_64-linux-gnu/libc-2.23.so
7fa968e3a000-7fa968e3c000 rw-p 001c4000 08:03 39714902                   /lib/x86_64-linux-gnu/libc-2.23.so
7fa968e3c000-7fa968e40000 rw-p 00000000 00:00 0 
7fa968e40000-7fa968e66000 r-xp 00000000 08:03 39714844                   /lib/x86_64-linux-gnu/ld-2.23.so
7fa969046000-7fa969049000 rw-p 00000000 00:00 0 
7fa969064000-7fa969065000 rw-p 00000000 00:00 0 
7fa969065000-7fa969066000 r--p 00025000 08:03 39714844                   /lib/x86_64-linux-gnu/ld-2.23.so
7fa969066000-7fa969067000 rw-p 00026000 08:03 39714844                   /lib/x86_64-linux-gnu/ld-2.23.so
7fa969067000-7fa969068000 rw-p 00000000 00:00 0 
7ffcf8e4b000-7ffcf8e6c000 rw-p 00000000 00:00 0                          [stack]
7ffcf8f1d000-7ffcf8f20000 r--p 00000000 00:00 0                          [vvar]
7ffcf8f20000-7ffcf8f22000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
Aborted (core dumped)
Run Code Online (Sandbox Code Playgroud)

jwi*_*mar 6

您有一个p指向由 返回的内存的变量malloc。然后将变量更改p为指向字符串文字“mark”占用的内存。当您尝试delete它时,您正在尝试删除字符串文字。

简而言之,生产线p = "mark"没有做你认为它在做的事情。它不会将该值复制到从 malloc 返回的内存中。

尝试将该行更改为strcpy(p, "mark"),我怀疑事情会开始变得更好。

(话虽这么说,我什至不应该提及,strcpy因为它太不安全了,并且有替代方法可以防止缓冲区溢出问题。但这是一个单独的问题,这里有很多关于它的讨论。)