以下の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を使用します。