我正在尝试使用****
指针打印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]);
有人为我提供了如何更正此代码的提示吗?
非常感谢您的支持。
答案 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)
您的代码中存在多个问题:
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
------------------------------------