snprintf()是否通过格式说明符使用根存储器?

时间:2019-03-19 21:13:24

标签: c

例如,我在一个函数中有10个此类调用,

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

然后,"Hello World"是否会在堆栈中总共存储十次(结果为11+(1)字节* 10 = 110字节)?

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

1 个答案:

答案 0 :(得分:4)

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

从C11 6.4.5:字符串文字

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

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