使用此typedef时遇到问题(在英特尔上运行,在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等等。 / p>
我尝试了一个明确的引用声明:
typedef char (&IPStringRef)[17];
但在ARM(Raspberry PI)上得到了相同的循环。
我确信我在这里没有正确使用typedef,但我不明白我做错了究竟是什么。
答案 0 :(得分:0)
你的问题还不清楚。在你说你说的问题的过程中,如果[我这样做]一切正常,那么#34;。所以明显的解决方案是:做到这一点。
我假设您在问为什么您在问题开头发布的代码无法正常工作。
假设代码是:
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
因为正确使用相对困难,并在以后查看代码时验证是否正确使用。