0

私は次のコードを持っています:

#include <stdio.h>
#include <string>

int scan_url(const char url[], char *hostname[], int maxhostlen) {
//stuff the function does...probably not relevant to this question
}
int main() {
    char url[63] = {'\0'};
    char hostname[63] = {'\0'};
    int help = scan_url(url, &hostname, 15);
    return(0);
}

関数scan_urlへのポインタでchar配列「hostname」を渡したい。ただし、試してみると、次のエラーが発生します。

エラーC2664:'scan_url':パラメータ2を'char(*)[63]'から'char*[]'に変換できません

このエラーは、ここに投稿したコードの最後から3行目を強調しています...具体的には、関数「scan_url」の「&」に下線を引いています。

何が起きてる?

編集:

私の目的は、scan_url関数で計算されたホスト名の値を返すことです。

4

4 に答える 4

1

これらは根本的に異なるタイプであるため、エラーが発生します。あなたの関数はポインターからポインターを期待していますが、これはあなたが提供しようとしているものであるポインターから配列と同じではありません。

提供された文字配列に書き込みたい場合は、通常のポインターを渡すだけです。

int scan_url(const char url[], char hostname[], int maxhostlen) {
    strcpy(hostname, "blah");  // or whatever
}


scan_url(url, hostname, 15);
于 2013-03-25T23:03:47.280 に答える
1

次のようにscan_urlを宣言できます。

int scan_url(const char url[], char hostname[], int maxhostlen) {

そしてそれをこのように呼んでください:

int help = scan_url(url, hostname, 15);
于 2013-03-25T23:07:21.533 に答える
1

通常、ポインターと配列表記の両方を関数パラメーターとして指定するのは冗長です。これらは両方ともポインターとして同じように扱われるためです。それらを組み合わせるということは、ポインターの配列、またはポインターへのポインターを渡そうとしていることを意味します。

*残りの宣言と一貫性を保つために、 :を取り出してください。

int scan_url(const char url[], char hostname[], int maxhostlen)
于 2013-03-25T23:07:52.457 に答える
1

紛らわしい、過度に示唆的な構文にもかかわらず、[]関数パラメーターでは配列を意味するのではなく、ポインターを意味します。

したがって、char url[]関数パラメータとして表示される場合urlは、charの配列の型ではなく、charへのポインタの型を持ちます。

同様に、char *hostname[]が関数パラメータとして表示される場合hostname、charへのポインタの型ではなく、charへのポインタへのポインタの型を持ちます。

Cでは、配列全体が関数に渡されることはありません。ThingへのポインターまたはThingの配列へのポインターのみを渡すことができ、配列自体は渡すことができません。そして、それ[]は「それはポインタです」と言うための代替方法として機能し、[]代わりに使用することの利点は*、ポインタを単一のものではなく、あるものへのポインタを渡し、その後に他のものを渡す意図を示すことができることですそれのように、IOW、配列の要素へのポインタ。

OTOHはchar something[][10]、関数パラメーターとして使用している場合something、10文字の配列へのポインターのタイプになります。最初のもの[]はに「崩壊」し*ます。

char (*something)[10]関数パラメーターとして持っている場合はsomething、10文字の配列へのポインターのタイプもあります。はすでにポインタであるため、ここには[]toの「減衰」はありません。*something

は、63文字の配列であり、63文字の配列へのポインタである&hostnameため、これは、main()を渡すときに関数に押し込もうとしていることとほぼ同じです。hostname&hostname

ただし、前に示したように、関数内のパラメーターの実際のタイプはhostname、charへのポインターへのポインターです。

したがって、渡すものと関数が期待するものは互換性のないものであり、それらは根本的に異なるタイプを持っています:63文字の配列へのポインターと文字へのポインターへのポインター。そして、それがあなたが見ているコンパイルエラーの理由です。

おそらくまたはに変更char *hostname[]する必要があります。char hostname[]char *hostname

于 2013-03-25T23:26:24.760 に答える