簡體   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