printf:这样安全吗?

Joz*_*oze 4 c printf

我只是想知道这个表达式是否安全:

int main (void)
{
  char my_tab[256];

  memset(my_tab,0x61,sizeof(my_tab));

  printf("Is it safe ? : %.256s",my_tab); /* is it safe ? */
}
Run Code Online (Sandbox Code Playgroud)

250*_*501 6

是的,你将打印出256个字符,仅此而已.

从C11标准7.21.6.P4:

一个可选的精度,它给出了d,i,o,u,x和X转换的最小位数,a,e,E,f的小数点字符后面出现的位数和F转换,g和G转换的最大有效位数,或s转换要写入的最大字节数.精度采用句点(.)的形式,后跟星号*(稍后描述)或可选的十进制整数; 如果仅指定了句点,则精度为零.如果精度与任何其他转换说明符一起出现,则行为未定义.

7.21.6.1.P8:

s:如果不存在l length修饰符,则参数应该是指向字符类型数组的初始元素的指针.数组中的字符被写入(但不包括)终止空字符.如果指定了精度,则不会写入多少个字节.如果未指定精度或大于数组的大小,则数组应包含空字符.

  • @JeremyP如果我的实施那样做那么我会想要我的钱! (4认同)
  • @JeremyP这是标准说的s:*如果不存在l长度修饰符,则参数应该是指向字符类型数组的初始元素的指针.280)数组中的字符被写入(但不包括)终止空字符.如果指定了精度,则不会写入多少个字节.如果未指定精度或大于数组的大小,则数组应包含空字符.* (2认同)