[英]Storing and Accessing 2D array in another array C
我在 C 中工作。(不是 C++)
我有以下代码(为了问题的目的而简化):
const unsigned char val[2][4] =
{
{ 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
};
const unsigned char** container[2] =
{
val,
val
};
print(container[0][0][0]);
我的期望是这会打印 1,但它不会(它打印 0,但我认为这正是在该内存地址处发生的事情)。
我希望这个print(container[0][1][2]);
打印 7. 它也没有。
我的目的是在某处定义一堆二维数组,然后存储所有这些二维数组的任何数组以供其他地方访问。
const unsigned char** container[1]
会给你一个“指向无符号指针的指针”的数组(只有一个元素)。
“指向无符号指针的指针”不能与数组索引一起使用,因为当您只有这样一个指针时,数组维度是未知的。
你想要的大概是:
const unsigned char (*container)[4] = val;
这使containter
成为指向 4 个无符号数组的指针。 现在内维是已知的,因此您可以使用数组索引,例如:
printf("%d\n", container[0][0]);
printf("%d\n", container[1][2]);
编辑
如果你真的想要一个数组,你可以这样做:
const unsigned char valA[2][4] =
{
{ 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
};
const unsigned char valB[2][4] =
{
{ 11, 12, 13, 14 },
{ 15, 16, 17, 18 },
};
const unsigned char (*container[2])[4] = {valA, valB};
printf("%d\n", container[0][0][0]);
printf("%d\n", container[0][1][2]);
printf("%d\n", container[1][0][0]);
printf("%d\n", container[1][1][2]);
#include <stdio.h>
const unsigned char val[2][4] =
{
{ 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
};
const unsigned char** container[1] = { val };
int main(void) {
printf("%d\n", container[0][0][0]);
}
和
% gcc val.c
val.c:8:40: warning: initialization of ‘const unsigned char **’ from incompatible pointer type ‘const unsigned char (*)[4]’ [-Wincompatible-pointer-types]
8 | const unsigned char** container[1] = { val };
| ^~~
val.c:8:40: note: (near initialization for ‘container[0]’)
和
% ./a.out
[1] 228086 segmentation fault (core dumped) ./a.out
经过值转换的数组名称成为指向第一个元素的指针。 val
的第一个元素是val[0]
,指向它的指针是&val[0]
并且它的类型是const unsigned char (*)[4]
。 二维数组不会专门衰减为双重间接指针。
container
的正确声明应该是(此处为 3 个,而不是 1 个指针,以提供示例:
const unsigned char (*container[3])[4] = { val, val, val };
如果有疑问,您可以使用cdecl 。
大多数时候它可能只是
#include <stdio.h>
const unsigned char val[2][4] =
{
{ 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
};
const unsigned char (*container)[4] = val;
int main(void) {
printf("%d\n", container[0][0]);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.