【问题标题】:Is there a way to pass a pointer to a variable without defining it prior based on function prototype requiring a pointer as one if its parameters?有没有一种方法可以传递一个指向变量的指针,而不需要根据函数原型预先定义它,如果它的参数需要一个指针作为一个指针?
【发布时间】:2020-04-22 12:39:19
【问题描述】:

我遇到了recv() 的问题,尽管有要读取的字节,但我总是会得到 -1 的返回值。我的问题是我这样称呼它:

ret = recvfrom(socket, &result, 10, 0, (struct sockaddr *)&addr, (socklen_t)(sizeof(addr)));

虽然最后一个参数实际上是对变量地址的要求,但该变量的地址保持不变。正确的调用是这样的:

socklen_t recsize = sizeof(addr);
ret = recvfrom(socket, &result, 10, 0, (struct sockaddr *)&addr, &recsize);

有没有一种方法可以将指针传递给需要在一行中全部使用指针的函数,而无需创建新变量并传递该变量的地址?

【问题讨论】:

  • 请选择 C ​​或 C++。它们是不同的语言。
  • 嗯,不。变量必须存在才能获得其地址。
  • @Peter:嗯,是的。函数需要传递的不是“变量”而是对象的地址,而C以复合字面量的形式提供了临时对象。
  • 请注意recvfrom 需要一个指针,因为它有时会在指向的对象中返回信息。您需要该信息来处理recvfrom 的所有潜在结果。如果您没有编写代码来处理所有情况,那么现在是开始开发该学科的好时机。

标签: c pointers parameter-passing


【解决方案1】:

C

使用复合文字

ret = recvfrom(..., &(socklen_t){sizeof(addr)});

由此类文字创建的对象具有自动存储持续时间(大致会在控制到达下一个 } 时被销毁)。

C++

编写一个返回右值地址的函数:

template <typename T>
[[nodiscard]] T *address_of_rvalue(T &&ref)
{
    return &ref;
}

像这样使用它:

ret = recvfrom(..., address_of_rvalue(socklen_t(sizeof(addr)));

在这个表达式中创建的临时对象将在完整表达式结束时被销毁(粗略地说,当控制到达;时)。

【讨论】:

  • 我想'我以前在某个地方见过这个符号,现在我知道它被称为复合文字。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-02
  • 2011-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多