【发布时间】:2014-12-14 17:58:40
【问题描述】:
我正在尝试用 C 编写一个基于用户输入生成螺旋并将其打印到控制台的程序。我无法弄清楚如何访问我在结构“Spiral”中定义的二维数组“数据”。如何修复“警告:来自不兼容的指针类型的赋值”错误?
#include <stdio.h>
typedef struct Spiral {
int size;
int **data;
} Spiral;
Spiral generateSpiral(int size);
void printSpiral(Spiral spiral);
static int rotate();
int main() {
int size;
scanf("%d", &size);
Spiral spiral = generateSpiral(size);
printSpiral(spiral);
return 0;
}
Spiral generateSpiral(int size) {
int data[size][size];
int i;
for (i = 0; i < size; i++) {
int j;
for (j = 0; j < size; j++) {
data[i][j] = 0;
}
}
for (i = 0; i < size; i++) {
data[0][i] = 1;
}
int currX = 0;
int currY = size - 1;
for (i = size - 1; i > 0; i -= 2) {
int j;
for (j = 0; j < 2; j++) {
int k;
switch (rotate()) {
case 0:
for (k = 0; k < i; k++) {
data[++currX][currY] = 1;
}
break;
case 1:
for (k = i; k > 0; k--) {
data[currX][--currY] = 1;
}
break;
case 2:
for (k = i; k > 0; k--) {
data[--currX][currY] = 1;
}
break;
case 3:
for (k = 0; k < i; k++) {
data[currX][++currY] = 1;
}
break;
}
}
}
Spiral spiral;
spiral.size = size;
spiral.data = data;
return spiral;
}
void printSpiral(Spiral spiral) {
int i;
for (i = 0; i < spiral.size; i++) {
int j;
for (j = 0; j < spiral.size; j++) {
switch (spiral.data[i][j]) {
case 0:
printf(" ");
break;
case 1:
printf("#");
break;
}
}
printf("\n");
}
}
static int rotate() {
static int val = 0;
int tmp = val;
val++;
if (val > 3)
val = 0;
return tmp;
}
【问题讨论】:
-
data(int data[size][size];) 的类型不是int **。也不能在指向自动局部变量的函数指针之外使用。 -
等等,当
size不是 const 时编译int data[size][size];?无论如何int data[][]与int** data是不同的类型 -
@luk32
int data[size][size]是普通的variable-length array。 -
如果
spiral.data = data;没有标记编译器警告,请提高您的警告级别,因为它是错误的。它们不是相同的类型,这并不重要,因为您正在保存一个本地自动地址,然后在函数返回并且data数组不再有效后期望它是有效的调用方。 -
@WhozCraig 我认为这正是发出警告/错误的行,因为那里显然存在类型不匹配。我认为如果解决了,接下来的事情就是分配一个超出范围的局部变量。它可能停在第一个错误的地方。
标签: c arrays struct multidimensional-array