![](/img/trans.png)
[英]C: malloc of string showing unexpected behaviour with double pointer and function calls
[英]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的内存的操作超出了分配范围,并且在随后的任何内存上“乱写”。 结果是不确定的 。 它可能会起作用,可能会崩溃,它可能会让您喝杯咖啡。 你不知道
顺便说一句,这是导致缓冲区溢出攻击的一种错误。
显然,代码中包含错误。
有两种可能性:
您“很幸运”地发现strcpy()没有遇到任何后果,因此该程序得以运行。
malloc()通常分配比请求更多的字节,以更好地保持内存对齐。 例如,它完全有可能以16个物理字节的块分配。
C不在乎您实际分配了多少(0除外;否则分配会变得很丑)。 只要您不超出各种任意的人为界限,您的程序就会(似乎)起作用。 您只是没有击中其中之一。
一个常见的误解是,这样的错误必须导致程序崩溃。 实际上,C标准明确表示,对于这种未定义的行为,“本国际标准没有任何要求”。
因此,该程序可能会立即崩溃,可能会破坏随机数据,或者它似乎可以运行。 就像Ed所说的那样,这是不安全的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.