C 必要时使用一次性缓冲器

C 必要时使用一次性缓冲器,c,C,假设我有以下函数,其中我不关心作为参数所需的tmp缓冲区,只需要函数的返回值。例如: char tmp[20]; printf("Using my function for case 1: %s", printstr(28, tmp)); 以下是执行上述操作的可接受方法吗 printf("Using my function for case 1: %s", printstr(28, (char[20]){0}) ); 这是一个可以接受的方法吗?或

假设我有以下函数,其中我不关心作为参数所需的
tmp
缓冲区,只需要函数的返回值。例如:

char tmp[20];
printf("Using my function for case 1: %s", printstr(28, tmp));
以下是执行上述操作的可接受方法吗

printf("Using my function for case 1: %s",
   printstr(28, (char[20]){0})
);

这是一个可以接受的方法吗?或者使用这种方法有什么缺点吗?

第6.5.2.5节C标准第6段提到复合文字:

复合文字的值是未命名对象的值 由初始值设定项列表初始化。如果出现复合文字 在函数体之外,对象具有静态存储 期间否则,它将具有与关联的自动存储持续时间 封闭块

因此,在你的问题中,函数调用的两种形式本质上是相同的


除了可读性或主观方面的考虑之外,没有理由选择一种形式而不是另一种形式——它们与书面形式具有相同的含义。

我更喜欢可读的形式。如果你真的关心堆栈上的20个字节,你可以把代码放在一个作用域块中。@paddy,说得好,谢谢。我总是忘记能够在函数和循环之外使用作用域块。在第二种情况下,这20个字节也将在堆栈上。我认为这两种方式本质上是相同的same@PaulHankin您是说在第二种情况下,
printf
返回后,该数组的堆栈分配仍然存在?这就是问题所在。在第一种情况下,我建议将其称为
dummy
unused
,而不是
tmp
,这样可以更好地记录该习语。这个问题可能是一个意见问题,因此不是一个真正有效的so问题。第二个是不可编译的C++(“取临时数组的地址”),这可能是一个考虑因素。