1

以下のpnArryCpyのポインターのインクリメントが正しくない理由を理解するのに問題があります。ポインタ表記を使用して配列を別の方法でコピーする方法を理解しましたが、これの何が問題になっているのか(たとえば、(* tgt_s)++;where int (*tgt_s)[cs])、およびなぜtgt_s左辺値(たとえば、tgt_s++有効)であるのに(実際には)左辺値*tgt_s ではないのかを理解する必要があります。

int main(void)
{

    int arr1[2][4] = { {1, 2, 3, 4}, {6, 7, 8, 9} }; 
    int arr2[2][4];                             

    pnArrCpy(4, arr1, arr2, arr2+2); // copies 2d array using pointer notation 
                                     // - this is where the problem is.
    printarr(2, 4, arr2); // this just prints the array and works fine - not at issue

    putchar('\n');
    return 0;
}

void pnArrCpy(int cs, int (*src)[cs], int (*tgt_s)[cs], int (*tgt_e)[cs])
{
    while (tgt_s < tgt_e)
    {

        **tgt_s=**src;  
        (* tgt_s)++; // older versions of gcc warn "target of assignment not really
                     // an lvalue", latest versions throw an error
        (* src)++;   // but no errors are runtime

    }

    return;
}

// trucated rest of program since it's not relevant, just the function for printing
// the array

古いgccでは、プログラムは正しい結果をコンパイルして表示します。

1 2 3 4 
6 7 8 9 

Mac OS 10.8.2gcc4.7.2
でエラーが発生しましたgcc4.2.1では
警告のみが表示されていました

ありがとうございました!!

編集:私が可変長配列を使用している理由:この関数は別のプログラムの一部であり、これはpnArrCpyのトラブルシューティングに使用していた単なるドライバーです。実際のプログラムでは、配列の次元と内容はユーザー定義であるため、VLAを使用します。

4

1 に答える 1

2

事は:

  • int (*tgt_s)[cs]配列へのポインタです。それについて考えるのに数秒かかります、それは少しエキゾチックなポインターです
  • *tgt_sしたがって、配列です
  • 配列は変更可能な左辺値ではありません

理解するのが最も難しいのは、C99の機能をcs使用して、パラメーターリストでそれを渡してから使用する方法です。

関数の引数としてのVLAについて詳しく知りたい場合は、この優れた投稿を確認してください。

于 2013-02-10T10:17:08.663 に答える