**glibc检测到***free():无效指针:0x0000000000400b2c

Ruc*_*chi 1 c

请考虑以下代码:

int main()
{
    char* s = (char*) malloc(sizeof(char)*10);
    s="hello";
    free(s);
}
Run Code Online (Sandbox Code Playgroud)

执行此程序时,我收到一个错误:

** glibc detected *** free(): invalid pointer: 0x0000000000400b2c

我对这个错误的研究表明它可能是由于没有分配足够的内存空间引起的malloc().但程序已经调用malloc(),产生足够的空间10 char秒.

Edd*_*tes 10

s="hello";
Run Code Online (Sandbox Code Playgroud)

您正在为s分配另一个地址到静态分配的内存.解放它是不正确的.此外,既然你这样做,你基本上泄漏了你在这里分配的内存:

char* s = (char*) malloc(sizeof(char)*10);
Run Code Online (Sandbox Code Playgroud)

尝试:

int main()
{
    static const size_t kBufferSize = 10;
    char* s = (char*) malloc(sizeof(char) * kBufferSize);
    strncpy(s,"hello", kBufferSize); // better than strcpy, you are protecting
                            // yourself from a buffer overflow
    free(s);
}
Run Code Online (Sandbox Code Playgroud)

  • 根据定义,字节是char是一个字节,因此sizeof(char)将始终为1,更好的实现将是sizeof(*s).在C中,转换malloc的结果是不必要的,并且可以隐藏其他错误(例如忘记定义malloc,导致malloc的隐式定义返回int)因此被认为是不良形式.如果这有助于清理事情. (3认同)

Mat*_*Mat 9

后:

s="hello";
Run Code Online (Sandbox Code Playgroud)

s不再指向动态分配的内存.它指向字符串文字"hello".你不能释放它,因为它首先没有被malloc编辑.你已经泄露了这个分配,因为你不再有指针.

查看strncpy将一个C字符串复制到另一个C字符串的函数.