是否可以在C中静态地创建指向2d数组的2d指针数组,例如:
#define m 4
#define n 4
#define p 2
#define q 2
char arr1[m][n] = {{0}};
char arr2[m][n] = {{0}};
char (*parr[m][n])[p][q] = {{&arr1, 0, &arr2, 0}};
int main() {
return 0;
}
指针的2d数组parr
是稀疏的,有些值为0 (NULL),这就是为什么我一开始不想使用4d数组。
这是编译的,但我收到以下警告:
警告:从不兼容指针类型初始化
使用以下命令:
gcc -Wall -Wextra -pedantic -std=c99 test.c
怎么啦?
发布于 2014-09-25 01:39:34
问题是,当您声明指针、数组和数组指针时,[]优先于*,除非添加括号。这就是为什么将数组指针声明为(*parr)[]
而不是*parr[]
的原因,因为后者提供了一个指针数组。
类似地,在声明指向2D数组的指针时,可以键入(*parr)[m][n]
。因此,将一个2D数组指针数组声明为((*parr)[m][n])[p][q])
似乎是合乎逻辑的。但是这里的括号实际上没有任何作用,这个表达式相当于(*parr)[m][n][p][q]
。这是一个指向4D数组的数组指针!这就是为什么你会收到编译器警告。
现在,您真正想要的是获得一个指向2D数组的数组指针数组,类似于char (*parr[p][q])[m][n]
。这看起来相当疯狂,没有人会理解这样的声明。
编写这样的代码的唯一明智的方法是通过类型防御:
typedef char arr_t[m][n];
arr_t arr1 = {{0}};
arr_t arr2 = {{0}};
arr_t* parr[p][q] =
{
{&arr1, 0},
{&arr2, 0}
};
发布于 2014-09-25 00:57:20
我想你要做的是:
char arr1[m][n] = {{0}};
char arr2[m][n] = {{0}};
typedef char (*some_type)[n]; // type of arr1 and arr2
some_type parr[p][q] = {{arr1, NULL}, {arr2, NULL}}; //array containing arr1 and arr2
然后您可以通过以下方式访问parr
printf("%c\n", parr[0][0][0][0]);
它将打印arr1[0][0]
。
发布于 2014-09-25 01:32:01
在parr声明中,我认为您的意思是使用p和q作为其维度:
$ cat test.c
#include <stdio.h>
#define m 4
#define n 4
#define p 2
#define q 2
char arr1[m][n] = {{0}};
char arr2[m][n] = {{0}};
char (*parr[p][q])[m][n] = {{&arr1, NULL}, {&arr2, NULL}};
int main(void)
{
printf("%d\n", (*parr[0][0])[0][0]);
return 0;
}
这与GCC的4.8.2编得干净利落:
$ gcc --version
gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ gcc -ansi -fsanitize=address -g -pedantic -Wall -Wextra -Wfatal-errors -Wno-unused-parameter -o test test.c
$
https://stackoverflow.com/questions/26033421
复制相似问题