【问题标题】:(C/C++) Initialize and return array in the same line(C/C++) 在同一行初始化并返回数组
【发布时间】:2020-11-16 16:24:41
【问题描述】:

我想知道如何使用 c/c++ 在同一行上初始化并返回一个数组。

我的直觉说语法应该是这样的:return (int8_t*) {hours, minutes, seconds};

我说的对吗?演员是强制性的吗?或者有其他/更好的方法吗?

编辑:我问这个是因为我现在无法测试代码。有几天我不会在电脑前。

回答:

  • 对于 C,请按照已验证答案中的步骤进行操作
  • 对于 C++,您可以使用 std::vectorstd::array 作为返回类型,然后使用 return { 1, 2, ..., N };

【问题讨论】:

  • 物有所值 - 试一试会更快。
  • 您要的是 C 还是 C++?在 C++ 中,您将使用 std::vectorstd::array 作为返回类型,然后使用 reutrn { 1, 2, ..., N };
  • 为什么你需要你可以坐在电脑前回答这个问题?对不起,但这不是问题不清楚的借口。请附上minimal reproducible example 以及您遇到的任何编译器错误或解释您在代码中遇到的问题
  • 另外,FWIW,如果你有互联网连接,你就有一个编译器。这里有几个在线编译器:OneTwoThree
  • 请考虑您的问题和答案不仅适合您。未来的读者会期待 C 或 C++ 的答案,当他们找到不同语言的答案时,他们会感到失望。你基本上是一次问两个问题

标签: c++ arrays c casting return


【解决方案1】:

这不会像你期望的那样工作。

您尝试做的确切语法是:

return (int8_t []){hours, minutes, seconds};

这会创建一个数组类型的复合文字。但是,此文字具有封闭范围的生命周期。因此,当函数返回时,返回的指针现在指向无效内存,并试图取消引用该指针调用 undefined behavior

您需要动态分配内存,然后分配数组的每个成员:

int8_t *p = malloc(3 * sizeof(int8_t));
p[0] = hours;
p[1] = minutes;
p[2] = seconds;
return p;

【讨论】:

  • @EricPostpischil 啊,是的,已更新以考虑到这一点。
  • malloc 版本应该使用int8_t 以与原始版本保持一致。
猜你喜欢
  • 2014-02-04
  • 1970-01-01
  • 1970-01-01
  • 2013-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-11
相关资源
最近更新 更多