[英]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.