【问题标题】:What return type should void *function()s use?void *function()s 应该使用什么返回类型?
【发布时间】:2017-05-27 20:51:26
【问题描述】:

这两个测试在我编译它们时都没有给我错误,但它们返回不同类型的指针。

void    *testone(void *x)
{
  return (x);
}

void    *testtwo(void *x)
{
  char *y;
  return (y);
}

这尤其令人困惑,因为我正在尝试重新创建 memcpy 函数,但我不知道我应该返回一个 void 指针还是一个无符号字符指针。

【问题讨论】:

  • testtwo 是不安全的,因为它返回一个未初始化的值,而不是因为与类型有关。
  • 您可以通过使用void *testtwo(void)(以避免“未使用参数”警告)然后初始化y来避免编译器的一些小问题。但是,这些都是与您的问题无关的挑剔,这很清楚。
  • Void * 泛型指针,在这种情况下返回类型需要是任何类型的指针。

标签: c


【解决方案1】:

在 C 中,任何对象指针类型都可以转换为 void *void * 可以转换为任何对象指针类型而无需任何强制转换。

您的代码遵守这些规则;没关系。编译器不应该抱怨。

ISO/IEC 9899:2011 §6.3.2.3 指针:

¶1 指向void 的指针可以转换为指向任何对象类型的指针或从指向任何对象类型的指针转​​换。指向的指针 任何对象类型都可以转换为指向void 的指针并再次返回;结果应 比较等于原始指针。

请注意,“对象”不包括函数——函数指针有单独的规则:

¶8 指向一种函数的指针可以转换为指向另一种函数的指针 键入并再次返回;结果应与原始指针比较。如果一个转换 指针用于调用类型与引用类型不兼容的函数, 行为未定义。

【讨论】:

    猜你喜欢
    • 2011-03-09
    • 1970-01-01
    • 2018-12-05
    • 2010-10-15
    • 2013-08-12
    • 1970-01-01
    • 1970-01-01
    • 2013-04-16
    • 2017-12-05
    相关资源
    最近更新 更多