我无法想象这还不是重复的,但是我无法轻易找到答案,因为专门针对C++的更复杂的场景似乎在讨论中占主导地位。

采取在C99中的函数调用的参数列表中构造的临时地址是否合法?

例如,类似于init_listinit_desig_init的代码如下:

typedef struct {
  int x;
  int y;
} point_t;

int manhattan(point_t *p) {
  return p->x + p->y;
}

int init_list() {
  return manhattan(&(point_t){1, 2});
}

int init_desig_init() {
  return manhattan(&(point_t){.x = 1});
}

大的three1 seem to compile it OK,但是我实际上找不到引用来解释临时的生存期至少会通过函数调用来延长。

0事实证明,基于下面M.M的回答,我搜索的部分问题是因为我正在寻找有关临时人员的信息,而针对此特定初始化构造的正确C术语是复合文字。

1与MSVC相比,我应该称其为“跨平台大三者”,但实际上我的意思是“C编译器Godbolt支持”。

最佳答案

(point_t){1, 2}不是“临时”的。这是一个复合文字。 (C++中相同的 token 序列具有不同的含义,这两种语言不应相互混淆)。

复合文字是左值,因此在其上使用一元&运算符是合法的。 C11 6.5.2.5/5涵盖了存储期限:



因此,此代码是正确的,并且复合文字一直存在直到声明它的函数结束为止。

关于c - 在C中获取临时(复合文字)参数的地址,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41927219/

10-11 16:41