错误:下标值既不是数组也不是指针也不是向量

时间:2013-07-21 05:55:14

标签: c pointers multidimensional-array compiler-errors

我正在尝试在传递2D数组后从函数返回2D数组。这是我已经走了多远,但我仍然得到了大量的编译错误。我已经尝试过搜索错误意味着什么但是我仍然非常困惑。我正在尝试将值数组旋转90度。有我的代码:

// Rotate Array 90 degrees
char * Rotate90Array(char *array, int rowCount, int columnCount) {
  // These have to be swapped because the image is being rotated
  char *returnArray[columnCount][rowCount];
  int u = rowCount - 1;
  int v = columnCount - 1;
  int i = 0;
  int j = 0;
  for (i = 0; i < rowCount; i++) {
    for (j = 0; j < columnCount; j++) {
      returnArray[i][j] = array[u-j][i];
      j++;
    }
    i++;
  }
  return returnArray;
}

以下是与此功能相关的错误:

P-MFunctionHolder.c: In function 'Rotate90Array':
P-MFunctionHolder.c:211:34: error: subscripted value is neither array nor pointer nor vector
P-MFunctionHolder.c:216:2: warning: return from incompatible pointer type [enabled by default]
P-MFunctionHolder.c:216:2: warning: function returns address of local variable [enabled by default]

我还有另一个函数调用前一个函数两次,将数组旋转180度,这给了我类似的错误。这是代码:

// Rotate Array 180 degrees
char * Rotate180Array(char *array, int rowCount, int columnCount) {
  char returnArray1[rowCount][columnCount] = Rotate90Array(array, rowCount, columnCount);
  char returnArray2[rowCount][columnCount] = Rotate90Array(returnArray1, rowCount, columnCount);
  return returnArray2;
}

以下是与此功能相关的错误:

P-MFunctionHolder.c: In function 'Rotate180Array':
P-MFunctionHolder.c:222:2: error: variable-sized object may not be initialized
P-MFunctionHolder.c:223:2: error: variable-sized object may not be initialized
P-MFunctionHolder.c:223:2: warning: passing argument 1 of 'Rotate90Array' from incompatible pointer type [enabled by default]
P-MFunctionHolder.c:199:8: note: expected 'char *' but argument is of type 'char (*)[(sizetype)(columnCount)]'
P-MFunctionHolder.c:224:2: warning: return from incompatible pointer type [enabled by default]
P-MFunctionHolder.c:224:2: warning: function returns address of local variable [enabled by default]

2 个答案:

答案 0 :(得分:2)

arraychar *。因此,array[rowCount]char。你打算如何进一步下标呢?

如果你需要一个2D数组,你应该将一个指向数组的指针传递给该函数。

同样地,

char returnArray2[rowCount][columnCount] = ...
return returnArray2;

这也是错误的,returnArray2从函数返回时会再次衰减到char (*)[columnCount],因此您也应该更改返回类型。

(是的,正如其他人所指出的,返回一个具有自动存储持续时间的数组调用UB,你应该动态地分配内存,或者将另一个数组传递给它就地修改的函数。)

答案 1 :(得分:0)

首先,您不能按C中的值返回数组。当然,您可以将它们作为参数传递,但请记住,对于包含多个维度的数组,您必须指定除第一个维度之外的所有维度的大小。

但是,您可以在堆上分配多维数组(即:指向数组的指针数组),这些数组可以从函数返回并作为“简单”参数传递(动态二维数组将作为char **传递) char * []),但是你必须非常小心地正确委托内存的所有权,否则等待内存泄漏。

我个人的偏好是使用结构将后者与维度信息一起封装。

哦,还有一件事:

char *returnArray[columnCount][rowCount];

以上是指针的二维数组,这不是你想要的......