首页 > 解决方案 > snprintf() 是否通过格式说明符使用根内存?

问题描述

例如,我在一个函数中有 10 个这样的调用,

snprintf(dest, sizeof(dest), "%s", "Hello World");

那么,"Hello World"一共会在栈上存储十次(结果是 11+(1) bytes * 10 = 110 bytes)?

请让我听听你的想法。谢谢。

标签: c

解决方案


字符串文字"Hello World"具有“静态存储持续时间”。实际上,这意味着它不在“堆栈”上。该标准没有指定相同的字符串文字是否“折叠”到一个实例中。

从 C11 6.4.5 开始:字符串文字

  1. ...然后使用多字节字符序列来初始化一个静态存储持续时间和长度的数组,刚好足以包含该序列。...
    7 如果这些数组的元素具有适当的值,则未指定这些数组是否不同。如果程序试图修改这样的数组,则行为未定义

“堆栈”在上面的引号中,因为该标准从未提及“堆栈”或“堆”或“ROM”。只有“自动”或“分配”或“静态”存储持续时间。大多数编译器确实具有概念的一对一映射。


推荐阅读