标签:
.
.
.
.
.
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\n", 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 个字节,依然可能引发错误。
所以大家在使用内存的时候一定要注意长度,千万不可越界。
C 语言 *** glibc detected *** free(): invalid next size (fast): 0x0000000000be1010 ***
标签:
原文地址:http://www.cnblogs.com/chuyuhuashi/p/4480117.html