[英]Passing “typedef char IPString[17]” as argument to a function
使用此typedef时,我遇到了问题(在Intel上运行,在ARM上运行奇怪):
typedef char IPString[17];
...
IPString ipStr;
extractIPfromURL("https://192.168.0.1:80", ipStr);
注意:我不能使用std :: string,因为代码需要在GCC和IAR上进行编译。 虽然IAR确实支持std :: string,但规则是不使用它。
如果extractIPfromURL签名为:
void extractIPfromURL(const char* url, IPString *ipStr);
和实现用途:
const char* ep;
...
strncpy(ipStr[0], &ep[start], end-start+1);
*ipStr[end+1] = '\0';
指针调用者:
IPString ipStr;
extractIPfromURL("https://192.168.0.1:80", &ipStr);
一切正常。
但是,如果我要使用签名:
void extractIPfromURL(const char* url, IPString &ipStr);
和实现:
const char* ep;
...
strncpy(&ipStr[0], &ep[start], end-start+1);
ipStr[end+1] = '\0';
来电者参考:
IPString ipStr;
extractIPfromURL("https://192.168.0.1:80", ipStr);
当我重写某些堆栈时,ARM上的代码似乎表现良好,并且本应迭代2个项目的循环会永远对2个项目进行迭代,例如:0、1、0、1、0、1等。
我尝试了一个显式的引用声明:
typedef char (&IPStringRef)[17];
但是在ARM(Raspberry PI)上有相同的循环。
我敢肯定我在这里没有正确使用typedef,但是我不明白我做错了什么。
您的问题还不清楚。 在问题中,您会说“如果[我这样做]一切正常”。 因此,显而易见的解决方案是:做到这一点。
我假设您是在问为什么您在问题开始时发布的代码不起作用。
假设代码是:
typedef char IPString[17];
void extractIPfromURL(const char* url, IPString *ipStr);
void some_function(void)
{
IPString ipStr;
extractIPfromURL("https://192.168.0.1:80", ipStr);
}
您应该得到一个编译错误。 如果没有看到错误消息,那么该是时候调整传递给编译器的标志了。 该代码违反约束,因为参数类型char *
与参数类型char (*)[17]
不匹配。
参数应与参数类型匹配。 您有(至少)三个不同的参数选项: IPstring
, IPstring *
, IPstring &
。 只要您传递匹配的参数形式,并且您在函数内正确使用了参数(它们的代码当然不包含任何其他错误),它们都将起作用。
如果仍然遇到问题,请尝试发布MCVE 。 目前,任何人都在猜测是什么原因导致了您在ARM上看到的问题,因为您只发布了一点点的内容。
您也可以考虑根本不使用typedef。
此代码可疑:
strncpy(&ipStr[0], &ep[start], end-start+1);
ipStr[end+1] = '\0';
如果start
不为零,则将\\0
放置到实际完成复制字符的末尾的距离。 我建议完全避免使用strncpy
因为这既很难正确使用,也很难在以后查看代码时验证正确使用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.