gpt4 book ai didi

c - 通过指针表示法写入二维数组

转载 作者:太空宇宙 更新时间:2023-11-04 02:58:28 25 4
gpt4 key购买 nike

我无法理解为什么在下面的 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 操作系统 10.8.2
gcc 4.7.2 给了我错误
gcc 4.2.1 只给我警告

谢谢!!

编辑:我使用可变长度数组的原因:这个函数是另一个程序的一部分,而这个只是我用来对 pnArrCpy 进行故障排除的驱动程序。在实际程序中,数组的维度和内容是用户自定义的,因此使用了VLA。

最佳答案

事情是:

  • int (*tgt_s)[cs] 是一个指向数组的指针。花几秒钟考虑一下,这是一个有点奇特的指针
  • *tgt_s 因此是一个数组
  • 数组不是可修改的左值

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

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

关于c - 通过指针表示法写入二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14796635/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com