繁体   English   中英

malloc…意外行为c编程

[英]malloc…unexpected behaviour c programming

#include<stdio.h>
#include<malloc.h>
#include<string.h>

void foo( char ** ptr)
{
   *ptr = malloc(0); // allocate some memory**
   strcpy( *ptr, "Hello World");
}

int main()
{
   char *ptr = 0;
   // call function with a pointer to pointer
   foo( &ptr );
   printf("%s\n", ptr);
   // free up the memory
   free(ptr);

   return 0;
}

而且它还在运行

#include<stdio.h>
#include<malloc.h>
#include<string.h>

void foo( char ** ptr)
{
   *ptr = malloc(11); // allocate some memory
   strcpy( *ptr, "Hello World");
}

int main()
{
   char *ptr = 0;
   // call function with a pointer to pointer
   foo( &ptr );
   printf("%s\n", ptr);
   // free up the memory
   free(ptr);

   return 0;
}

更改任意数量的malloc ...它一直在运行。怎么可能? Hello World有12个字符,因此怎么可以在0、12、8和任何数字中运行。

您遇到C不做任何边界检查的事实。 因此,您复制到malloc的内存的操作超出了分配范围,并且在随后的任何内存上“乱写”。 结果是不确定的 它可能会起作用,可能会崩溃,它可能会让您喝杯咖啡。 你不知道

顺便说一句,这是导致缓冲区溢出攻击的一种错误。

显然,代码中包含错误。

有两种可能性:

  1. 您“很幸运”地发现strcpy()没有遇到任何后果,因此该程序得以运行。

  2. malloc()通常分配比请求更多的字节,以更好地保持内存对齐。 例如,它完全有可能以16个物理字节的块分配。

C不在乎您实际分配了多少(0除外;否则分配会变得很丑)。 只要您不超出各种任意的人为界限,您的程序就会(似乎)起作用。 您只是没有击中其中之一。

一个常见的误解是,这样的错误必须导致程序崩溃。 实际上,C标准明确表示,对于这种未定义的行为,“本国际标准没有任何要求”。

因此,该程序可能会立即崩溃,可能会破坏随机数据,或者它似乎可以运行。 就像Ed所说的那样,这是不安全的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM