C 语言 *** glibc detected *** free(): invalid next size (fast): 0x0000000000be1010 ***

.

.

.

.

.

LZ 今天在写一个 Socket 程序的时候使用 malloc(3) 在堆上动态分配了一个结构体的空间,在使用完之后用 free(3) 函数释放空间的时候报 invalid next size 这样的一个错误,经过了两个小时的调试,最后发现是因为粗心越界导致的。

LZ 把这个错误缩减为一个最简单的模型发布出来:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 
 5 int main (void)
 6 {
 7         char *p = NULL;
 8 
 9         // 在堆空间申请 8 字节的内存
10         p = malloc(8);
11 
12         // 实际使用超过 8 字节
13         strncpy(p, "abcd", 128);
14         // 可以正常打印
15         printf("p = %s
", p);
16 
17         // 释放内存时会报 invalid next size 错误
18         free(p);
19 
20         return 0;
21 }

编译运行:

>$ gcc -Wall free.c -o free
>$ ./free
p = abcdefghijklmn
*** glibc detected *** ./free: free(): invalid next size (fast): 0x00000000020c3010 ***
...此处生略 n 行...

打印是不受影响的,但其实在 strncpy(3) 的时候就已经越界了,所以发生什么情况都是正常的。

另外对于上面这个栗子,使用 strcpy(3) 替代 strncpy(2) 就不会报错了,但是一旦要拷贝的字符超过了 8 个字节,依然可能引发错误。

所以大家在使用内存的时候一定要注意长度,千万不可越界。

原文地址:https://www.cnblogs.com/0xcafebabe/p/4480117.html