传递" typedef char IPString [17]"作为函数的参数

时间:2017-11-08 19:21:11

标签: c++ arrays pointers pass-by-reference typedef

使用此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,但我不明白我做错了究竟是什么。

1 个答案:

答案 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]不匹配。

参数应与参数类型匹配。您有(至少)三个不同的参数选项:IPstringIPstring *IPstring &。它们都可以工作,只要你传递匹配的参数形式,并在函数内正确使用参数(当然你的代码不包含任何其他错误)。

如果您仍然遇到问题,请尝试发布MCVE。目前,任何人都在猜测是什么导致了你在ARM上看到的问题,因为你只发布了点点滴滴。

你也可以考虑不使用typedef。

此代码可疑:

strncpy(&ipStr[0], &ep[start], end-start+1);
ipStr[end+1] = '\0';

如果start不为零,那么您将\0放置在实际复制完字符的位置的末尾。我建议完全避免使用strncpy因为正确使用相对困难,并在以后查看代码时验证是否正确使用。