malloc ...意外行为c编程

时间:2011-03-03 05:50:28

标签: c malloc

#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,任意数字中运行。

4 个答案:

答案 0 :(得分:3)

您遇到的事实是C不进行任何边界检查。因此,您对malloc内存的复制过度运行分配,并在随后的任何内存上“涂鸦”。结果是 undefined 。它可能会起作用,它可能会崩溃,它可能会让你喝杯咖啡。你不知道。

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

答案 1 :(得分:2)

代码中有错误,显然。

有两种可能性:

  1. 你得到的是“幸运的”strcpy()没有任何后果,所以程序运行。

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

答案 2 :(得分:0)

C并不关心你实际分配了多少(除了0;如果你这样做,事情会变得很丑陋);只要你没有超越各种任意人为界,你的程序就会(看起来)起作用。你刚刚没有击中其中一个。

答案 3 :(得分:0)

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

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