为什么在写入不够大的malloc内存时strcpy“工作”?

可能重复:
为什么故意不正确地使用strcpy不会失败呢?

下面是下面的代码:

char* stuff = (char*)malloc(2); strcpy(stuff,"abc"); cout<<"The size of stuff is : "<<strlen(stuff); 

即使我分配2个字节的东西,为什么strcpy仍然工作,strlen的输出是3.不应该抛出像索引越界的东西?

C和C ++不像Java和C#那样进行自动边界检查。 这段代码将覆盖字符串末尾的内存中的东西,破坏那里的东西。 这可能导致奇怪的行为或以后崩溃,所以对这些事情保持谨慎是好的。

通过C和C ++标准,访问数组末尾被认为是“未定义的行为”。 这意味着标准没有规定程序执行时必须发生的事情,因此触发UB的程序永远不会发生任何可能发生的事情。 它可能会继续工作,没有明显的问题。 它可能会立即崩溃。 在做一些不应该是问题的其他事情时可能会崩溃。 它可能行为不端而不是崩溃。 或者快速龙可能来吃你。 任何事情都可能发生。

顺便说一下, 写过数组的末尾称为缓冲区溢出 ,这是安全漏洞的常见原因。 如果那个“abc”字符串实际上是用户输入,那么熟练的攻击者可以将字节放入其中,最终覆盖类似函数的返回指针,这可以用来使程序运行不同的代码,并且执行不同的操作。这应该。

你只是写堆内存,通常不会崩溃,但以后会发生坏事。 C不会阻止你射击自己的脚,没有arrays越界。

不,您的字符指针现在指向长度为3的字符。通常这不会导致任何问题,但您可能会覆盖某些关键内存区域并导致程序崩溃(您可能会看到分段错误)。 特别是当您在大量内存上执行此类操作时

这里是“strcpy”的实现

 char *strcpy(char *strDestination, const char *strSource)  {  assert(strDestination && strSource);  char *strD=strDestination;  while ((*strDestination++=*strSource++)!='\0')  NULL;  return strD;  } 

你应该确保目的地有足够的空间。 然而,它是什么,它是。

在复制strSource之前,strcpy没有检查strDestination中是否有足够的空间,因此它不执行边界检查,因此可能会超出或超出。 这是缓冲区溢出的潜在原因。