malloc和strcpy交互

时间:2017-12-12 23:29:18

标签: c malloc strcpy nul

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

char *myString = malloc(5); // enough space for 5 characters (no '\0')
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 '\0'
free(myString);

以上所有内容似乎都能正常运作。我已经尝试对每个字符使用printf()来查看是否存在null终止符,但是'\ 0'似乎只是打印为空格。

我的困惑在于:

  • 字符串文字将始终具有隐式空终止符。
  • strcpy应该将空终止符复制到myString上,但是没有足够的分配堆内存
  • printf / strlen不应该工作,除非myString有一个终结符

由于myString显然有一个空终止符,它在哪里?它只是放在随机存储位置吗?以上代码是否等待发生错误?

1 个答案:

答案 0 :(得分:3)

解决你的三点:

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

正确。

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

strcpy无法知道目标缓冲区有多大,并且会愉快地写出它的结尾(覆盖内存中缓冲区之后的内容。有关此端到端访问的信息查找缓冲区溢出或缓冲区溢出'这些是常见的安全漏洞。 要获得更安全的版本,请使用strncpy,它将目标缓冲区的长度作为参数,以便不写入它的末尾。

    除非myString有终结者,否则
  • printf / strlen不应该工作

前期不应该工作'这里有点模糊。 printf / strlen / etc将继续通过内存读取,直到找到一个null终止符,这可能是在字符串之后或者可能是数千字节之外(在你的情况下你已经在myString之后立即将空终止符写入内存所以printf / strlen / etc会在那里停止。)

最后: - 上面的代码是否等待发生错误?

是。您正在覆盖尚未分配的内存,这可能会导致任何问题庄严,具体取决于所覆盖的内容。 从strcpy手册页:

  

如果strcpy()的目标字符串不够大,那么可能会发生任何事情。溢出的固定长度字符串缓冲区是一种最受欢迎​​的黑客技术,用于完全控制机器。每当程序将数据读取或复制到缓冲区时,程序首先需要检查是否有足够的空间。如果您可以证明溢出是不可能的,那么这可能是不必要的,但要小心:程序可能会随着时间的推移而发生变化,从而可能使不可能发生。