関数の引数として(ARM上のインテル上で動作し、奇数実行結果):パッシング「typedefの文字IPString [17]」私が問題に遭遇してきた
は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、等
Iは、明示的な参照宣言試み:
typedef char (&IPStringRef)[17];
がなくARM(ラズベリーPI)上の同じループを得ました。
私はここでtypedefを正しく使用していないと確信していますが、間違っていることは正確に分かりません。
std :: stringを使用してください –
「すべて動作しますか?この場合、 '* ipStr [end + 1] = '\ 0';' extractIPfromURL'の内側が間違っているので、これは意味をなさないようです。その場合、 '(* ipStr)[end + 1] = '\ 0';が必要です。かっこは絶対に必要です。さもなければ、コードはそれがあなたが思うものをしません。 – AnT
配列を参照渡しするのは本当に意味がありますか? 'void extractIPfromURL(const char * url、IPString ipStr);'を直接使わないのはなぜですか? (配列は最初の要素へのポインタにとにかく減衰します。) – Cameron