2013-02-10 65 views
1

我無法理解爲什麼遞增下面的pnArryCpy中的指針不正確。我想了解如何用指針表示法以不同的方式複製數組,但我需要了解這有什麼問題(例如,(* tgt_s)++;其中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.2
GCC 4.7.2給我的錯誤
GCC 4.2。 1只給了我警告

謝謝!

編輯:我使用可變長度數組的原因:此功能是另一個程序的一部分,而這一個只是我用來解決pnArrCpy故障的驅動程序。在實際的程序中,數組的尺寸和內容是用戶定義的,因此使用VLA。

回答

2

的事情是:

  • int (*tgt_s)[cs]指針數組。花幾秒鐘思考的是,這是一個有點異國情調的指針,因此
  • *tgt_s是一個數組
  • 數組是不可修改的左值

是什麼使得它最難理解的是你的方式使用通過cs的C99功能,然後在參數列表中使用它。

如果您想了解更多關於VLA的函數參數,請查看this excellent post

+0

我想知道爲什麼這個編譯。 – 2013-02-10 10:17:41

+0

@ H2CO3使用參數列表中的「cs」爲C99。我通過Jens Gustedt鏈接了一篇文章。 – cnicutar 2013-02-10 10:24:52

+0

我的意思是編譯器如何允許增加一個數組。 – 2013-02-10 10:26:24