首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >malloc...unexpected行为c++编程

malloc...unexpected行为c++编程
EN

Stack Overflow用户
提问于 2011-03-03 13:50:28
回答 4查看 301关注 0票数 0
代码语言:javascript
运行
复制
#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;
}

而且它还在运行

代码语言:javascript
运行
复制
#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;
}

通过任何number...it更改malloc始终是running.how,这是可能的?Hello World有12个字符,所以可以在0,12,8,任何数字中运行。

EN

回答 4

Stack Overflow用户

发布于 2011-03-03 13:54:22

您遇到的事实是C不执行任何边界检查。因此,你复制到malloc'd的内存是在超量运行分配,并在随后的内存上“涂鸦”。结果是不确定的。它可能会起作用,可能会崩溃,可能会给你泡一杯咖啡。你不知道。

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

票数 3
EN

Stack Overflow用户

发布于 2011-03-03 14:03:26

很明显,代码中有bug。

有两种可能性:

  1. 你很幸运,因为strcpy()没有命中任何有意义的东西,所以程序运行了。
  2. malloc()通常会分配比请求多几个字节,以便更好地保持内存对齐。例如,它完全有可能以16个物理字节为单位进行分配。
票数 2
EN

Stack Overflow用户

发布于 2011-03-03 13:54:38

C并不关心你实际分配了多少(除了0;如果你这样做,事情可能会变得很糟糕);只要你不超过各种人为的限制,你的程序就会(看起来)工作。你只是没有撞到他们中的一个。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5177152

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档