-2

私のコード(簡単に言えば)が関数に構造体のポインタを渡すことを割り当てるのに問題があります

struct userCom{
    int x;
    int y;
}

main(void){
    struct userCom com;
    userComFunction(com);
    printf("%d", com.x);
}

userComFunction(struct userCom *return_type){
    struct userCom temp;
    temp.x = 10;
    printf("%d", temp.x);
    *return_type = temp;
}

それは印刷されます

10
11537460

ポインターを間違って通過していますか? com.x が 10 に等しくない理由がわかりません

4

2 に答える 2

3

他の人が指摘しているように、問題は、間違ったタイプの引数を に渡していることですuserComFunction。しかし、本当の問題は、コンパイラがそれを伝えていないことです。

C90 (これは 2 つの標準より前のことです) の時点で、目に見える宣言なしで関数を呼び出すことは合法であり、コンパイラは関数が実際にどのように見えるかについて (しばしば正しくない) 仮定を行います。コンパイラが への呼び出しを認識した場合、userComFunctionの宣言または定義を認識していないためuserComFunction、エラーを診断できません。

C99 の時点では、可視宣言なしで関数を呼び出すことは制約違反です。つまり、コンパイラは少なくともそれについて警告する必要があります。C99 では「暗黙のint」ルールも削除されたため、関数宣言で戻り値の型を省略できなくなりました。は戻り値の型 ( not !) でmain宣言する必要があり、 は何も返さないため、 にする必要があります。int voiduserComFunctionvoid

userComFunctionの完全な定義を の定義の上に移動するかmain、定義をそのままにして「前方」宣言を追加することができます。

void userComFunction(struct userCom *return_type);

int main(void) {
    /* ... */
}

void userComFunction(struct userCom *return_type) {
    /* ... */
}

これを行うと、コンパイラは次の呼び出しを通知する必要があります。

userComFunction(com);

間違っています。(修正は に変更comすること&comです。)

より多くの警告を有効にするには、gcc のコマンドライン オプションも使用する必要があります。例えば:

gcc -std=c99 -pedantic -Wall -Wextra

-std=c99ISO C99 ルールを適用するように指示します。これらのルールを実際-pedanticに施行するように言います。追加の警告を有効にします。-Wall-Wextra

于 2013-10-08T18:57:28.623 に答える
0

x に 10 を割り当てたい場合は、このようにします。これが正しいコードです-

struct userCom{
int x;
int y;
}
void struct userComFunction(struct userCom*);
main(void)
{
struct userCom com;
userComFunction(&com);
printf("%d\n", com.x);
}

userComFunction(struct userCom *return_type){
struct userCom temp;
temp.x = 10;
printf("%d\n", temp.x);
return_type->x= temp.x;
}
于 2013-10-08T19:00:00.323 に答える