malloc 和 strcpy 交互

malloc and strcpy interactions

我一直在测试 malloc() 和各种字符串函数之间的交互,以尝试更多地了解指针和内存在 C 中的工作方式,但我对以下交互有点困惑。

char *myString = malloc(5); // enough space for 5 characters (no '[=10=]')
strcpy(myString, "Hello"); // shouldn't work since there isn't enough heap memory
printf(%s, %zd\n", myString, strlen(myString)); // also shouldn't work without '[=10=]'
free(myString);

上面的一切似乎都正常工作。我已经尝试对每个字符使用 printf() 来查看是否存在空终止符,但是 '\0' 似乎只是打印为空白 space 无论如何。

我的困惑在于:

因为 myString 显然有一个空终止符,它在哪里?它只是被放置在一个随机的内存位置吗?上面的代码是等待发生的错误吗?

解决你的三点:

  • 字符串文字将始终具有隐式空终止符。

正确。

  • strcpy 应该将空终止符复制到 myString 上,但是分配的堆内存不足

strcpy 无法知道目标缓冲区有多大,并且会愉快地写入它的结尾(覆盖内存中缓冲区之后的任何内容。有关此结尾的信息-access 查找 'buffer overrun' 或 'buffer overflow'。这些是常见的安全漏洞)。 对于更安全的版本,使用 strncpy 它将目标缓冲区的长度作为参数,以免写入超过它的末尾。

  • printf/strlen 不应该工作,除非 myString 有终止符

“不应该”这个词在这里有点含糊。 printf/strlen/etc 将继续读取内存,直到找到一个空终止符,它可能紧接在字符串之后,也可能相隔数千个字节(在您的情况下,您已经在 myString 之后立即将空终止符写入内存,所以printf/strlen/etc 将停在那里。

最后:

  • 上面的代码是等待发生的错误吗?

是的。您正在覆盖尚未分配的内存,这可能会导致任何问题,具体取决于被覆盖的情况。 来自 strcpy 手册页:

If the destination string of a strcpy() is not large enough, then anything might happen. Overflowing fixed-length string buffers is a favorite cracker technique for taking complete control of the machine. Any time a program reads or copies data into a buffer, the program first needs to check that there's enough space. This may be unnecessary if you can show that overflow is impossible, but be careful: programs can get changed over time, in ways that may make the impossible possible.