- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
#include<stdio.h>
#include<stdlib.h>
main() {
int *ptr, *tmp;
ptr = (int *)malloc(sizeof(int) * 60);
tmp = ptr;
printf("tmp %u ptr %u\n", tmp, ptr);
int i =0;
for (i = 0; i < 76; i ++)
{
*ptr = i;
ptr++;
}
printf("tmp %u ptr %u\n", tmp, ptr);
free (tmp);
}
this program crahes when we run it
{124}: ./a.out
tmp 23134224 ptr 23134224
tmp 23134224 ptr 23134528
*** glibc detected *** ./a.out: double free or corruption (!prev): 0x0000000001610010 ***
======= Backtrace: =========
/lib64/libc.so.6[0x333ce750c6]
./a.out[0x4005e0]
/lib64/libc.so.6(__libc_start_main+0xfd)[0x333ce1ecdd]
./a.out[0x400499]
======= Memory map: ========
00400000-00401000 r-xp 00000000 00:2b 26388454 /users/home40/rnadakud/cpract/a.out
00600000-00601000 rw-p 00000000 00:2b 26388454 /users/home40/rnadakud/cpract/a.out
01610000-01631000 rw-p 00000000 00:00 0 [heap]
333c600000-333c620000 r-xp 00000000 fd:00 1253867 /lib64/ld-2.12.so
333c81f000-333c820000 r--p 0001f000 fd:00 1253867 /lib64/ld-2.12.so
333c820000-333c821000 rw-p 00020000 fd:00 1253867 /lib64/ld-2.12.so
333c821000-333c822000 rw-p 00000000 00:00 0
333ce00000-333cf97000 r-xp 00000000 fd:00 1253879 /lib64/libc-2.12.so
333cf97000-333d197000 ---p 00197000 fd:00 1253879 /lib64/libc-2.12.so
333d197000-333d19b000 r--p 00197000 fd:00 1253879 /lib64/libc-2.12.so
333d19b000-333d19c000 rw-p 0019b000 fd:00 1253879 /lib64/libc-2.12.so
333d19c000-333d1a1000 rw-p 00000000 00:00 0
333ee00000-333ee16000 r-xp 00000000 fd:00 1253886 /lib64/libgcc_s-4.4.6-20110824.so.1
333ee16000-333f015000 ---p 00016000 fd:00 1253886 /lib64/libgcc_s-4.4.6-20110824.so.1
333f015000-333f016000 rw-p 00015000 fd:00 1253886 /lib64/libgcc_s-4.4.6-20110824.so.1
7f085a471000-7f085a474000 rw-p 00000000 00:00 0
7f085a492000-7f085a495000 rw-p 00000000 00:00 0
7ffffddb2000-7ffffddc7000 rw-p 00000000 00:00 0 [stack]
7ffffddff000-7ffffde00000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
Abort (core dumped)
我知道我正在覆盖数组,但这里观察到崩溃发生在我空闲时(tmp)现在即使我写完了 ptr ,但是当我 free(ptr) 应该只释放前 60 个字节
请帮助我理解这个错误。
最佳答案
覆盖调用未定义的行为。
在你的例子中,你破坏了堆的数据结构,导致 free()
做一些崩溃的事情。这就是它被称为“未定义行为”的原因,因为您不知道何时、如何或是否会有任何可观察到的“证据”表明您做错了什么。或者它可以稍后在程序执行看似无关的事情时出现。
关于c - 双重自由或腐败的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23566114/
一个特定文档不会更新,而同一查询会更新我查询的任何其他 _id: Category.findOneAndUpdate( {_id : req.params.id}, {parent :
我正在使用 ifstream 读取文件头。编辑:我被要求放置完整的最小程序,所以就在这里。 #include #include using namespace std; #pragma pack(
typedef struct { int *info; } row; struct { row* head; int len; int size; } list; in
在索引 block 时我在 debug.log 中有错误: 2016-11-14 15:14:52 UpdateTip: new best=000000000000038ad111e773453f17
我是一名优秀的程序员,十分优秀!