订阅值不是数组也不是指针

时间:2014-11-29 03:50:09

标签: c arrays malloc realloc

我有一个程序从文件中读取一个二维数组,并使其成为一个锯齿状数组(其中每一行的大小完全适合所有非零元素)。然后它打印出阵列。

但我有几个问题我无法弄清楚。

具体地

  

26:我收到一个警告(赋值从没有强制转换的指针生成整数

     

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

我该怎么做才能解决它?

int main() {

FILE *inputFile1 = fopen("denseMatrix1.txt", "r");

char inputBuffer[SIZE];
int dim1, dim2, input, i, j;
int *mtrx1;

fgets(inputBuffer, SIZE, inputFile1);
sscanf(inputBuffer, "%d%d", &dim1, &dim2);

mtrx1 = malloc(sizeof(int *) * dim1);

for (i=0; i<dim1; i++) {
    int cols=0;
    int *row = malloc(sizeof(int) * cols);
    fgets(inputBuffer, SIZE, inputFile1);
    for (j=0; j<dim2; j++) {
        sscanf(inputBuffer, "%d", input);
        printf("i=%d   j=%d    input=%d\n", i, j, input); // ADDED LINE (NOT PRINTING)
        if (input) {
            cols++;
            row = realloc(row, sizeof(int) * cols);
            row[cols-1] = input;
        }
    }
    mtrx1[i] = row;
    cols=0;
}

int mtrx3[DIM1][DIM2] = {0};

// Prints first 2 matrices
printf("First matrix: \n");
printMatrix(mtrx1, dim1);/*

return 0;


// Prints a 2d array matrix
void printMatrix(int *mtrx, int dim1) {
int i, j;
for (i=0; i<dim1; i++) {
    for (j=0; j<(sizeof(mtrx[i]) / sizeof(int)); j++) {
        printf("%d ", mtrx[i][j]);
    }
    printf("\n");
}
printf("\n\n");

文件denseMatrix1.txt的内容:

7 8
0 0 0 5 1 0 0 5
0 0 0 0 0 0 0 0
0 0 0 0 1 2 0 0
1 0 0 0 0 0 0 0
3 0 0 5 0 0 3 0
1 0 0 0 0 3 0 0
0 0 0 0 0 0 0 1

2 个答案:

答案 0 :(得分:1)

取代

int *mtrx1;

使用

int **mtrx1;

使用前一个声明,mtrx[i]评估为int。您需要将其评估为int*才能使用:

mtrx1[i] = row;

<强>更新

使用fgets获取一行文字并将文字行与sscanf一起使用的策略在for循环中不起作用。

让我们走矩阵的第一行:

0 0 0 5 1 0 0 5

for循环:

for (j=0; j<dim2; j++) {
    sscanf(inputBuffer, "%d", input);
    printf("i=%d   j=%d    input=%d\n", i, j, input); // ADDED LINE (NOT PRINTING)
    if (input) {
        cols++;
        row = realloc(row, sizeof(int) * cols);
        row[cols-1] = input;
    }
}

for循环中,每次第一行都会0 {@ 1}}。 input不会存储您第一次阅读的内容,并会从剩下的内容继续。

您需要提出不同的策略。例如:

sscanf

答案 1 :(得分:0)

第26行警告

以下是有问题的一行:

mtrx1[i] = row;

以下是这些变量的声明:

int *mtrx1;
int ..., i, ...;
int *row = ...;

正如您的警告消息所示,您正在尝试获取指针值row,并将其分配给int的数组。假设您希望mtrx1成为单个row子阵列的数组,则应相应地更改其类型 - 来自int *,这是int的数组s,到int **,这是int s的数组的数组。

第44行错误

相关代码:

void printMatrix(int *mtrx, int dim1) {
    int i, j;
    ...
    printf("%d ", mtrx[i][j]); // line 44
    ...
}

此行上的错误是与上述问题类似的问题的结果 - mtrx被声明为int的一维数组,但在第44行中,您有两个下标,就像它是一个二维数组。通过将mtrx的类型更改为int **来解决此问题。

For Loop

for循环未能遍历所有值,因为您的sscanf行不明确 - %d值之间没有空格,因此sscanf不能告诉哪个号码应该是哪个,并将它们作为一个值读取。这意味着永远不会正确设置dim2

对于这种错误,使用断点通常是了解程序中发生的事情的最简单方法,特别是对于循环。如果你还没有调查它们,你应该这样做。

其他信息

第26行给出了警告,而第44行给出了一个错误,因为指针的定义方式与C中的int相关.C允许“指针算术”,这意味着指针可以被视为普通数字除了引用对象或数组。

当您在C中下标数组时,表达式的类型实际上只会删除*;例如,下标int *数组的类型为int。因此,当您尝试将指针指定给int *mtrx1时,它会将其视为尝试分配指向int变量的指针,因此指针会转换为其原始数值。这是完全合法的C,但被大多数程序员认为是相当糟糕的做法(由于各种原因),因此编译器会给你一个警告。

第44行是相反的情况 - 您的mtrx[i][j]表达式等同于(mtrx[i])[j]。由于mtrx被定义为int *,这意味着您有效地最终尝试下标int,这在C中是非法的。没有警告,只是一个错误。