【发布时间】:2014-04-03 14:26:15
【问题描述】:
我对 realloc 有一个奇怪的 printf 行为。了解堆损坏我做了一个简单的程序测试。
void testFct(){
char *buffer;
buffer = (char *)malloc( 8 ); //Allocate 8 bytes
strcpy(buffer,""abcdefghijklm"); //Generate memory overwrite
fprintf(stdout,"\nOrginal buffer = %s\t",buffer);
fprintf(stdout,"%d bytes\n",_msize(buffer) );
buffer = (char *)realloc(buffer,512); //Reallocate more bytes
fprintf(stdout,"Buffer after reallocation = %s\t",buffer);
fprintf(stdout,"%u bytes\n",_msize(buffer) );
free(buffer); //Free the buffer
fprintf(stdout,"Buffer after freed = %s\t\t",buffer);
fprintf(stdout,"%u bytes\n\n",_msize(buffer) );
}
void main(){
printf("something\n");
testFct();
}
当我从 main 中删除 printf 时,程序运行并显示:
Orginal buffer = abcdefghijklm 8 bytes
Buffer after reallocation = abcdefgh 512 bytes
Buffer after freed = 0→h 0 bytes
当我在调用 testFct 之前添加 printf 时,程序显示此行并崩溃。
Orginal buffer = abcdefghijklm 8 bytes
Buffer after reallocation = (null)
如您所见,第二行显示重定位后缓冲区的内容,根据 MSDN,ReAlloc 如果失败,则必须不更改缓冲区,但在我的情况下,它将缓冲区设置为 null,这就是 _msize 崩溃的原因,也是我的程序崩溃的原因。
问题是:printf 的行为是什么?当我把它放在 testFct 之前发生了什么?
【问题讨论】:
-
"...如果失败,ReAlloc 必须不要更改缓冲区..." 它可能不会,但如果
realloc()失败,它会返回 @987654325 @ 并以此将buffer设置为NULL。
标签: c memory-management printf memory-corruption