当输出足够小时,给 snprintf() 太大的大小

124*_*123 5 c printf undefined-behavior

这段代码会导致未定义的行为吗?因为缓冲区只有 128 字节长,但我告诉snprintf()它更长。但是,生成的字符串短于 128 字节。

#include <stdio.h>

int main(void)
{
  char buffer[128];
  snprintf(buffer,294201,"%s","ABC");
  puts(buffer);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

Eri*_*hil 5

C 2018 7.21.6.5 2 说:

\n
\n

snprintf函数等效于fprintf,不同之处在于输出被写入数组(由参数指定s)而不是流中。如果n为零,则不写入任何内容,并且s可能是空指针。否则,超出n-1st 的输出字符将被丢弃而不是写入数组,并在实际写入数组的字符末尾写入一个空字符。

\n
\n

请注意,这并不是说snprintf传递了一个n或多个字符的数组。因此snprintf,没有任何许可假设它可以写入,s[n-1]除非fprintf它相当于会写入n字符(包括终止空字符)。

\n

从另一个角度来看,假设我们定义一个包含buffer294,201 个字符的数组,用数据填充它,然后调用snprintf(buffer,294201,"%s","ABC");. 我们会期望除了前四个字符之外没有任何改变吗?如果缓冲区中的其他字节发生变化,则此snprintf调用不会与 \xe2\x80\x9ce 等效fprintf,除非输出被写入数组\xe2\x80\xa6\xe2\x80\x9d 我认为这是一种违规如果它进一步改变了缓冲区中的任何内容,则遵循本规范。

\n