Roz*_*uur 1 c heap malloc free
试着理解我的问题的答案
当试图释放由堆管理器分配的内存时会发生什么,它分配的内容超过了要求?
我写了这个函数,并对其输出感到困惑
int main(int argc,char **argv){
char *p,*q;
p=malloc(1);
strcpy(p,"01234556789abcdefghijklmnopqrstuvwxyz"); //since malloc allocates atleast 1 byte
q=malloc(2);
// free(q);
printf("q=%s\n",q);
printf("p=%s\n",p);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
产量
q=vwxyz
p=01234556789abcdefghijklm!
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释这种行为吗?或者这个实现是否具体?
如果free(q)被取消注释,我也会收到SIGABRT.
您正在复制*p比分配的更多的字节,覆盖分配的空间后可能存在于内存位置的任何内容.
当你再次调用malloc时,它需要一部分内存,它知道此时未使用(在*p此时间之后恰好是几个字节),在那里写入一些簿记信息并返回指向该位置的新指针.
簿记信息malloc写入恰好以'!'开头.在此运行中,后跟一个零字节,因此您的第一个字符串被截断.新的指针发生在你之前覆盖的内存的末尾.
所有这些都是特定于实施的,并且可能导致每次运行或根据月亮的相位产生不同的结果.第二次调用malloc()也绝对是以可怕的方式崩溃程序的权利(特别是因为你可能会覆盖malloc内部使用的内存).
这次你很幸运:这是一个未定义的行为,不指望它.
通常,但根据操作系统,内存分配在"页面"(即多个字节)中.Malloc()另一方面,以更"细化"的方式从那些"页面"分配内存:存在与管理的每个分配相关联的"开销" malloc.
你得到的信号free很可能与你通过写过你分配的内容来搞乱内存管理这一事实有关,p即写入内存管理器用来跟踪内存块等的开销信息.