2017-07-03 67 views
-1

我一直在读的C字符串的ISO C标准,我很好奇,编译器如何确定被定义为C字符串时的静态缓冲区的大小?给定下面的示例c字符串,C字符串静态缓冲区的字节大小

#include <stdio.h> 

int main(){ 
    char *str = "Jello, World\0"; 
} 

13个字符的字符串将是13个字节,据推测,然而,根据ISO C 07+标准字符串文字§6.5.4 903

903的多字节字符序列然后用于初始化静态存储持续时间和长度刚好足以包含序列的阵列。

对我而言,“恰到好处”的措辞很奇怪。这是否意味着,对于C字符串的静态缓冲区并不总是需要一个给定的C字符串的确切大小,可能它可能有更多的空间比需要的?

我也发现了ISO C 2010草案和§6.5.4 6 pg.71,但是这个版本也谈到缓冲区“足够”。有人可以确定这个缓冲区是准确的还是有其他信息呢?

+0

如果字符串是长度的'13'字节则仅13个字节将被分配。 – haccks

+0

这是13个字符,而不是14个? – ThingyWotsit

+0

没有分配静态缓冲区。 'str'是一个指针,而不是一个数组。并没有ISO C07或2010标准(草案不是自动的)。标准是ISO9899:2011,即C11。以前的版本是C99。该标准非常清楚如何将字符串文字转换为多字节字符序列。 – Olaf

回答

2

类型字符串常量"Jello, World\0"的是char [14]。对于字符串中的每个字符(包括任何显式空字节)加上隐式空终止字节都足够大。

+0

谢谢你,所以你的意思是,缓冲区将永远是准确的?即字符串长度加上隐含的空字符?如果是这样的话,那么他们在使用“恰到好处”的文档中的措辞是否真的如此? – Miket25

+0

@ Miket25是的,这就是“恰到好处”的意思,即足够大以容纳字符串加空字节,但不大。 – dbush