使用4维立方体的指针

时间:2019-03-02 11:10:55

标签: c pointers

我正在尝试使用****指针打印4D立方体

#include <stdio.h>
#include <stdlib.h>

#define DIM 4

void printCube(char ****cube, int dim) {
    int x, y, z;
    for (z = 0; z < dim; z++) {
        for (y = 0; y < dim; y++) {
            for (x = 0; x < dim; x++) {
                printf("%c ", *cube[z][y][x]);
            }
            printf("\n");
        }
        printf("------------------------------------\n");
    }
}

int main() {
    char ***cube = (char ***)malloc(sizeof(char **) * DIM);
    int x, y, z;
    for (z = 0; z < DIM; z++) {
        cube[z] = (char **)malloc(sizeof(char **) * DIM);
        for (y = 0; y < DIM; y++) {
            cube[z][y] = (char *)malloc(sizeof(char *) * DIM);
            for (x = 0; x < DIM; x++) {
                cube[z][y][x] = ((x + y + z) % 26) + 'A';
            }
        }
    }

    printCube(&cube, DIM);

    for (z = 0; z < DIM; z++) {
        for (y = 0; y < DIM; y++) {
            for (x = 0; x < DIM; x++) {
                free(cube[z][y][x]);
            }
            free(cube[z][y]);
        }
        free(cube[z]);
    }
    free(cube);
    return 0;
}

我确定该错误很容易,但是我现在尝试了几个小时才能弄清楚。

应该只是在其他地方printf上使用指针(因为如果我只打印字符,那可以正常工作)

printf("%c ", *cube[z][y][x]);

有人为我提供了如何更正此代码的提示吗?

非常感谢您的支持。

3 个答案:

答案 0 :(得分:2)

cube的地址传递到printCube时,无需使用地址。而是直接将其传递,在char ***中将其声明为printCube,然后在cube[z][y][x]中将其作为printCube进行访问。

现在,您在*cube[z][y][x]中使用printCube,这是行不通的,因为*的绑定比[]宽松。如果将其更改为(*cube)[z][y][x],它将起作用。但是正如我所说,一开始就不需要额外的间接级别。

答案 1 :(得分:1)

您是运算符优先级的受害者。在C语言中,后缀运算符的优先级高于前缀运算符。在您的情况下,前缀运算符为'*',后缀运算符为'[]'

因此,表达式:

*cube[z][y][x]

等效于:

*(cube[z][y][x])

这是不希望的,因为cube[z][y][x]是指向无效内存的指针,并且尝试使用该指针将导致未定义的行为。

您应该首先取消引用cube指针,然后使用下标运算符:

(*cube)[z][y][x]

这可以解决您的问题。另一方面,由于您不尝试修改函数中的cube指针的值,而只是使用它的值,因此可以简化函数以采用char ***。然后,您可以按值传递cube指针,而不必担心运算符的优先级。

答案 2 :(得分:0)

您的代码中存在多个问题:

  • 您的多维数据集只有3个维度,它是一个普通的多维数据集,表示为指向int数组的指针的数组。直接将此数组传递给printCube函数实际上将指向类型为int ***的指针指向其第一个元素。在您的情况下,由于已分配顶级数组,因此您已经具有类型为int ***的指针。因此,函数原型应为void printCube(char ***cube, int dim)。没有理由传递指针的地址而不是指针的值。
  • 分配大小的计算中存在一些错误:cube[z] = (char **)malloc(sizeof(char **) * DIM);应该

    cube[z] = (char **)malloc(sizeof(char *) * DIM);
    

    cube[z][y] = (char *)malloc(sizeof(char *) * DIM);应该是

    cube[z][y] = (char *)malloc(sizeof(char) * DIM);
    
  • 您应该在释放循环中删除一个级别,因为cube[z][y][x]不是分配的指针,而只是cube[z][y]指向的数组中的一个字符。编译器接受一个简单的警告就很可惜。您应该使用gcc -Wall -Werror来避免这种愚蠢的错误。

这是更正的版本:

#include <stdio.h>
#include <stdlib.h>

#define DIM 4

void printCube(char ***cube, int dim) {
    int x, y, z;
    for (z = 0; z < dim; z++) {
        for (y = 0; y < dim; y++) {
            for (x = 0; x < dim; x++) {
                printf("%c ", cube[z][y][x]);
            }
            printf("\n");
        }
        printf("------------------------------------\n");
    }
}

int main() {
    char ***cube = (char ***)malloc(sizeof(char **) * DIM);
    int x, y, z;
    for (z = 0; z < DIM; z++) {
        cube[z] = (char **)malloc(sizeof(char *) * DIM);
        for (y = 0; y < DIM; y++) {
            cube[z][y] = (char *)malloc(sizeof(char ) * DIM);
            for (x = 0; x < DIM; x++) {
                cube[z][y][x] = ((x + y + z) % 26) + 'A';
            }
        }
    }

    printCube(cube, DIM);

    for (z = 0; z < DIM; z++) {
        for (y = 0; y < DIM; y++) {
            free(cube[z][y]);
        }
        free(cube[z]);
    }
    free(cube);

    return 0;
}

输出:

A B C D
B C D E
C D E F
D E F G
------------------------------------
B C D E
C D E F
D E F G
E F G H
------------------------------------
C D E F
D E F G
E F G H
F G H I
------------------------------------
D E F G
E F G H
F G H I
G H I J
------------------------------------