请看一下这段代码。我为第一个变量分配一个字节,为第二个变量分配另一个字节。但是,似乎编译器分配更多(或者我缺少一些东西)。程序输出两个字符串,即使它们的长度多于一个字节。
void main() {
char* some1 = malloc(1);
sprintf(some1,"cool");
char* some2 = malloc(1);
sprintf(some2,"face");
printf("%s ",some1);
printf("%s\n",some2);
}
拜托,任何人都可以发现在分配内存时发生的事情。
答案 0 :(得分:7)
您分配一个字节,然后超出分配的内存范围。 sprintf
没有边界检查(其朋友,snprintf
确实检查了边界。)
当你超出你分配的内存时,你会得到未定义的行为,所以任何事情都可能发生。在您的情况下,它似乎正常工作。你的程序也可能崩溃,或者其他任何事情都可能发生。
答案 1 :(得分:7)
您正在调用未定义的行为。在这一点上绝对可能发生任何事情,包括你可能期望的事情。
实际发生的是系统会以更大的块为您分配内存。因此,当您超出程序定义的范围时,就系统而言,您还没有超越缓冲区。几乎所有实现都这样做;例如,系统跟踪16字节块比在逐个字节的基础上更容易跟踪。
答案 2 :(得分:2)
未定义的行为!
特别是在调试版本中,malloc()
通常会将任何分配请求舍入到合理的边界。但是你不能依赖这种行为,只是因为它今天在测试程序中适用于你并不意味着它可以在真实世界的程序中运行。
答案 3 :(得分:2)
您为阵列分配“至少”1个字符,然后将5个字符分配给它(字符串为4,\ 0为1)。您通常会覆盖阵列外的内存,这不是一个好主意。
它起作用的原因是你得到了(不)幸运,因为没有别的东西被破坏了。
答案 4 :(得分:1)
通常情况下,操作系统会为您提供比您更简单的簿记或其他任何原因所要求的更多。如果您使用的金额超过您请求的金额,则程序的行为是未定义的。
使用像Valgrind这样的程序,它会告诉你,你做错了什么。