我试图编写一个程序来打印一个未指定维度的多维矩阵,我发现当我写入
void**
行时,该程序不会运行。这是为什么?
#include <stdio.h>
#include <stdlib.h>
int main() {
int n = 0;
printf("The size of matrix\n");
scanf("%d", &n);
int **rows; //it doesnt work with void
rows = malloc(n * sizeof(int *));
int i, j;
for (i = 0; i < n; i++) {
rows[i] = malloc(n * sizeof(int));
}
for (i = 0; i < 3; i++) {
for (j = 0; j < 3; j++) {
rows[i][j] = i + j;
printf("%d", rows[i][j]);
}
printf("\n");
}
return 0;
}
当我写 void**
时不运行
这是因为您无法取消引用
void
指针,因为它没有引用任何类型。
根据规范,为什么当我使用
指针而不是void**
时程序无法运行?int**
void
是一种无法完成的不完整类型 (C 2018 6.2.5 19)。它主要是为了促进以通用方式使用指针。
当
rows
声明为void **
时,rows[i][j]
的类型为void
。在 rows[i][j]=i+j;
中,您尝试将值分配给 void
对象。
要为对象赋值,编译器需要该对象的完整类型。它需要知道对象在内存中的表示方式,以便它可以写入表示内存中值的字节。当类型为
void
时,它是不完整的,并且没有关于如何在内存中表示值的信息。
C 标准指定了赋值的左操作数类型的约束,而
void
不满足这些约束,因此编译器会发出诊断消息。
void 指针表示该指针基本上是空的,因此它能够保存程序中的任何数据类型地址。 但要访问数据,需要进一步类型转换为其他数据类型。
#include <stdio.h>
#include <stdlib.h>
int main() {
int n = 0;
printf("The size of matrix\n");
scanf("%d", &n);
void **rows; //it works now
rows = malloc(n * sizeof(int *));
int i, j;
for (i = 0; i < n; i++) {
rows[i] = malloc(n * sizeof(int));
}
for (i = 0; i < 3; i++) {
for (j = 0; j < 3; j++) {
*((int *)(*rows + i) + j) = i + j;
// rows[i][j] = i + j;
printf("%d", *((int *)(*rows + i) + j));
}
printf("\n");
}
return 0;
}