#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,任意数字中运行。
答案 0 :(得分:3)
您遇到的事实是C不进行任何边界检查。因此,您对malloc内存的复制过度运行分配,并在随后的任何内存上“涂鸦”。结果是 undefined 。它可能会起作用,它可能会崩溃,它可能会让你喝杯咖啡。你不知道。
顺便说一下,这是导致缓冲区溢出攻击的错误。
答案 1 :(得分:2)
代码中有错误,显然。
有两种可能性:
你得到的是“幸运的”strcpy()没有任何后果,所以程序运行。
malloc()经常分配比请求更多的字节,以更好地保持内存对齐。例如,它完全有可能以16个物理字节的块分配。
答案 2 :(得分:0)
C并不关心你实际分配了多少(除了0;如果你这样做,事情会变得很丑陋);只要你没有超越各种任意人为界,你的程序就会(看起来)起作用。你刚刚没有击中其中一个。
答案 3 :(得分:0)
这是一种常见的误解,像这样的错误必然导致程序崩溃。实际上,C标准明确指出,对于这样的未定义行为,“这个国际标准没有要求。”
因此程序可能会立即崩溃,它可能会破坏随机数据,或者它似乎有效。这就像Ed说的那样不安全。