【问题标题】:incompatible pointer type warning in c?c中不兼容的指针类型警告?
【发布时间】:2014-03-06 10:00:11
【问题描述】:
uint32 measurements [32];

Xcp_Addr_t XcpApp_ConvertAddress( uint32 address, uint8 extension )
{

    return &measurements[address];  //return from incompatible pointer type 

}

address 是我从客户端收到的值(例如:0,1,2.....)。上述函数作为将测量的地址返回给其他内部函数。我收到如下警告:

return from incompatible pointer type

谁能告诉我如何解决这个问题?

【问题讨论】:

  • Xcp_Addr_t 的 typedef 是什么?
  • typedef uint8* Xcp_Addr_t;
  • 那么,uint8_t*uint32_t* 不一样——我猜你有你的理由吗?

标签: c++ c arrays pointers memory-address


【解决方案1】:

这完全取决于Xcp_Addr_t 的类型。你的表达是:&measurements[address]。表达式的类型可转换为uint32*。如果您的返回类型是伪装的uint32,那么只需删除& 运算符。如果你的返回类型完全不同,你要重新考虑你在做什么。


所以你的 typedef 是:

typedef uint8* Xcp_Addr_t;

你可以看到uint8*(返回类型)和uint32*(实际返回值的类型)不匹配。您可以将返回类型或数组measurements 的类型更改为:

uint8 measurements[32];

好的,所以你要确保XcpApp_ConvertAddress 返回一个有效的指针(不会超出范围)。你有两个选择:

  • 断言它
  • 抛出异常

您可以通过以下方式断言它:

assert(address < 32);
return &measurements[address];

在这种情况下,如果传递给函数的地址不正确,程序将在运行时失败(请注意,您必须添加#include &lt;cassert&gt; 才能使用assert)。

您也可以抛出异常:

if (address < 32) throw std::runtime_error("out of bounds");
return &measurements[address];

(请注意,std::runtime_error 需要 #include &lt;stdexcept&gt;)。

【讨论】:

  • 应该是 uint8 测量值[32];
  • 您可能还想在返回之前检查address &lt; 32;否则,您将执行越界数组访问。
  • Xcp_Addr_t XcpApp_ConvertAddress( uint32 address, uint8 extension ) { /* TODO: 查看这个实现 / int i; / 假设不需要转换。 */ for(i=0; i
  • @user3383557,你总是要返回第一个元素的指针。
  • if(address
【解决方案2】:

您必须决定是否要返回 measurements[address] 的值或其指针!

【讨论】:

  • 我要返回测量的地址
  • 所以声明你的变量'Xcp_Addr_t'就像'typedef uint8* Xcp_Addr_t;'
  • @Anis_Stack 请添加您的代码部分作为答案的一部分。
猜你喜欢
  • 1970-01-01
  • 2015-10-10
  • 1970-01-01
  • 1970-01-01
  • 2021-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多