通过指针表示法写入2D数组

时间:2013-02-10 10:10:49

标签: c arrays pointers gcc lvalue

我无法理解为什么递增下面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。

1 个答案:

答案 0 :(得分:2)

事情是:

  • int (*tgt_s)[cs]是指向数组的指针。花几秒钟考虑一下,这是一个异国情调的指针
  • *tgt_s因此是一个数组
  • 数组不可修改lvalues

最难理解的是您使用C99功能传递cs然后在参数列表中使用它的方式。

如果您想了解有关VLA作为函数参数的更多信息,请查看this excellent post