Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将平面指针强制转换为多维数组_C_Multidimensional Array - Fatal编程技术网

C 将平面指针强制转换为多维数组

C 将平面指针强制转换为多维数组,c,multidimensional-array,C,Multidimensional Array,可以让编译器在平面指针上执行与在多维数组上相同的指针算法吗 对于多维数组,指针算法的工作方式如下: int main(void) { char ar[2][3][4]; #define At(a,x,y,z) printf("["#x"]["#y"]["#z"]=%ld\n", &(a)[x][y][z] - &(a)[0][0][0]); At(ar,0,0,0); At(ar,0,0,1); At(ar,0,0,2); At(ar,0,

可以让编译器在平面指针上执行与在多维数组上相同的指针算法吗

对于多维数组,指针算法的工作方式如下:

int main(void)
{
    char ar[2][3][4];
#define At(a,x,y,z) printf("["#x"]["#y"]["#z"]=%ld\n", &(a)[x][y][z] - &(a)[0][0][0]);
    At(ar,0,0,0);
    At(ar,0,0,1);
    At(ar,0,0,2);
    At(ar,0,0,3);
puts("");
    At(ar,0,1,0);
    At(ar,0,2,0);
    At(ar,0,3,0);
puts("");
    At(ar,1,0,0);
    At(ar,2,0,0);
    At(ar,3,0,0);
/*
    [0][0][0]=0
    [0][0][1]=1
    [0][0][2]=2
    [0][0][3]=3

    [0][1][0]=4  // 1 * 4
    [0][2][0]=8  // 2 * 4
    [0][3][0]=12 // 3 * 4

    [1][0][0]=12 // 1 * 3 * 4
    [2][0][0]=24 // 2 * 3 * 4
    [3][0][0]=36 // 3 * 3 * 4 
*/
}
所以我试着:

    char *blk;
    if(!(blk=malloc(1000))) return -1;
    char (*p)[2][3][4] = (char(*)[2][3][4])blk;

    At(p,0,0,0);
    At(p,0,0,1);
    At(p,0,0,2);
    At(p,0,0,3);
puts("");
    At(p,0,1,0);
    At(p,0,2,0);
    At(p,0,3,0);
puts("");
    At(p,1,0,0);
    At(p,2,0,0);
    At(p,3,0,0);

/*
    [0][0][0]=0
    [0][0][1]=1
    [0][0][2]=2
    [0][0][3]=3

    [0][1][0]=3
    [0][2][0]=6
    [0][3][0]=9

    [1][0][0]=6
    [2][0][0]=12
    [3][0][0]=18
*/
}
但正如你所看到的,这并没有给出相应的结果。
这到底是怎么回事?是否可以使结果匹配?

您添加了一个额外维度,请尝试以下操作:

char (*p)[3][4] = (char(*)[3][4])blk;
还请注意,您的
printf
格式不正确:两个指针的差异为type
ptrdiff\u t
,相应的格式长度修饰符为
t

#define At(a,x,y,z) printf("["#x"]["#y"]["#z"]=%td\n", &(a)[x][y][z] - &(a)[0][0][0]);
如果您的C库不完全兼容C99,则应使用强制转换:

#define At(a,x,y,z) printf("["#x"]["#y"]["#z"]=%ld\n", (long)(&(a)[x][y][z] - &(a)[0][0][0]));

我想你错过了一次取消引用。现在有了指向三维数组的指针

您需要这样做:

At(*p, 0, 0, 1);

char(*p)[2][3][4]=(char(*)[2][3][4])&blk从此点开始使用p是未定义的行为。@2501
char*blk=malloc(1000);如果(!blk)返回-1;char(*p)[2][3][4]=(char(*)[2][3][4])blk
更好?一个定义了,另一个没有定义。你分配了太多的内存,因为1000不能被24整除。OT:do
void*blk
将不再需要这种难看的演员阵容。