【问题标题】:printf() with realloc() crashes the programprintf() 和 realloc() 使程序崩溃
【发布时间】: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();

}

当我从 ma​​in 中删除 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


【解决方案1】:

这个:

strcpy(buffer, "abcdefghijklm");    //Generate memory overwrite

导致未定义的行为。因此,任何对该程序行为的分析都是毫无意义的。任何事情都有可能发生。

另外,please don't cast the return value of malloc() in C

【讨论】:

  • 好的。未定义的行为,所以我的程序可能运行可能会崩溃。对于您的第二个建议“不要在 C 中强制转换 malloc() 的返回值”,请在我的代码中更改一行以查看。我做char *buffer= malloc( sizeof(char) * 8 ); 但不编译(VS2008)**无法从 void * 转换为 char * ** 。谢谢你。隐藏帮助 303 个字符 评论使用 mini-Markdown 格式:link italic
  • ^ 我确定您使用的是 C++ 编译器。尝试更改为“c”
  • @Phiber 请注意,我说的是“在 C 中”。在您似乎出于某种原因正在编译的 C++ 中,规则是不同的。如果你想用 C 编程,请确保你的编译器知道这一点。
  • 是的,我现在似乎很清楚了。感谢您放松、Digital_Reality 和 alk 编辑代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-22
  • 1970-01-01
  • 1970-01-01
  • 2015-06-28
  • 1970-01-01
  • 1970-01-01
  • 2017-03-26
相关资源
最近更新 更多