繁体   English   中英

将“ typedef char IPString [17]”作为参数传递给函数

[英]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]不匹配。

参数应与参数类型匹配。 您有(至少)三个不同的参数选项: IPstringIPstring *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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM