可能重复:
通过指针传递二维数组
int table[20][20];
int** table1 = table;
int a;
table[0][0] = 4;
a = table1[0][0];
最后一行给了我访问冲突,我不明白..
提前致谢!
可能重复:
通过指针传递二维数组
int table[20][20];
int** table1 = table;
int a;
table[0][0] = 4;
a = table1[0][0];
最后一行给了我访问冲突,我不明白..
提前致谢!
简短的回答是指向指针的指针与数组数组不同。
您不能在一次赋值中从二维 int 数组创建 int **。首先,您需要分配正确数量的指针:table1 = malloc(sizeof(int*) * 20);
然后你可以使用一个循环来填写你的下一级指针:
for(int i = 0; i < 20; i++)
table1[i] = table[i];
原因是指向指针的指针是一个保存地址的内存位置。当您进行第一次分配时,该指针指向 20 个 int 指针。然后我们为每个指针分配原始表中每一行的第一个地址。现在,当我们使用 时a = table1[0][0]
,编译器将获取 table1[0] - 所以我们在循环中设置的数组中的第一个指针。这指向 table[0] 行,因此我们从中获取 [0] 元素,并获取填充在那里的 4 [当然,任何其他数字索引也将得到 4,因此很难证明它有效就在这种情况下)。
在这种table[y][x]
情况下,编译器将获取 table 的地址,将 y * 20 * sizeof(int) 添加到它,然后添加 x * sizeof(int)。这让我们在“桌子”所在的“方形”内存块中占据了一个不错的位置。
(再次,输入太多,自从我开始写这篇文章以来,还有两个答案)
C 编译器太宽容了:
int** table1 = table;
cc:在函数'main'中:cc:3:17:警告:从不兼容的指针类型初始化[默认启用]
如果我们输入不正确的代码,编译器会抱怨,而我们忽略抱怨然后得到一些奇怪的结果,我们应该想知道吗?
无论如何,table1 并不指向指向 int 的指针,它崩溃的方式是实现问题(对齐、分段等)
虽然 table1[1]
是指针类型,但在table
.
给定
int table[20][20];
table
兼容int*
,不兼容int**
。
这应该编译并能够table1
从table1[0]
to访问table1[399]
:
int* table1 = table;
问问自己:给定一个指针,并被告知访问第 3、4 项 - 编译器应该如何知道二维数组的第一个维度有多大,以便跳过正确数量的项目?
正确:一点也不。