3

可能重复:
通过指针传递二维数组

int table[20][20];
int** table1 = table;
int a;
table[0][0] = 4;
a = table1[0][0];

最后一行给了我访问冲突,我不明白..

提前致谢!

4

6 回答 6

13

简短的回答是指向指针的指针与数组数组不同。

于 2012-12-25T22:11:15.790 回答
5

您不能在一次赋值中从二维 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)。这让我们在“桌子”所在的“方形”内存块中占据了一个不错的位置。

(再次,输入太多,自从我开始写这篇文章以来,还有两个答案)

于 2012-12-25T22:19:07.767 回答
1

C 编译器太宽容了:

int** table1 = table;

cc:在函数'main'中:cc:3:17:警告:从不兼容的指针类型初始化[默认启用]

如果我们输入不正确的代码,编译器会抱怨,而我们忽略抱怨然后得到一些奇怪的结果,我们应该想知道吗?

无论如何,table1 并不指向指向 int 的指针,它崩溃的方式是实现问题(对齐、分段等)

于 2012-12-25T22:23:55.040 回答
0

虽然 table1[1]是指针类型,但在table.

于 2012-12-25T22:17:00.057 回答
0

给定

int table[20][20];

table兼容int*,不兼容int**

这应该编译并能够table1table1[0]to访问table1[399]

int* table1 = table;
于 2012-12-25T22:18:27.420 回答
0

问问自己:给定一个指针,并被告知访问第 3、4 项 - 编译器应该如何知道二维数组的第一个维度有多大以便跳过正确数量的项目?

正确:一点也不。

于 2012-12-25T22:22:15.117 回答