错误:下标值不是数组,指针或向量,而idk是什么问题?

时间:2017-04-10 15:26:46

标签: c arrays pointers vector

本练习的目的是使用动态内存分配的双下标方法。     该程序的输入是位于名为的文件中的浮点数据的二维数组     testdata2。输入数组将包含3行数据,每行包含5列数据。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    FILE *fp;
    int temp;
    int number;
    int r = 3;
    int c = 5;

    fp = fopen("testdata2.txt", "r");

    number = (int)malloc(r * c * sizeof(int));

    while (fscanf(fp, "%d", &temp) != EOF){
        for(int i = 0; i < 3;i++){
            for(int j = 0; j < 5; j++){
                temp = number[i][j];
            }
        }   
    }   

    return(0);
}

4 个答案:

答案 0 :(得分:1)

在您的代码中存在大量不正确的事情(其中任何一个都可能导致未定义的行为):

  1. 核心数据类型错误。该问题专门要求浮点值,但您使用的是整数类型。
  2. C中任何内存分配的接收者都应该是一个指针;您正在使用简单的int
  3. 您隐藏了您通过压铸获得的任何警告/错误。 Casting malloc in C isn't necessary, nor advised
  4. 即使其他所有内容都已修复,temp = ...的作业语句也是向后。您希望将刚刚读取的值保存到矩阵中,而不是将其丢弃并用您刚刚分配的内存中未定义的值覆盖它。
  5. 所有这些都说,知道数组数组的宽度为5,问题就减少了。注意temp根本不需要

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        static const size_t r = 3;
        static const size_t c = 5;
    
        FILE *fp = NULL;
        double (*number)[c] = NULL; // pointer to array of dimension c.
    
        fp = fopen("testdata2.txt", "r");
        if (fp == NULL)
        {
            perror("Failed to open file: ");
            return EXIT_FAILURE;
        }
    
        number = malloc(r * sizeof *number); // allocate r-rows of dimension c
        if (number == NULL)
        {
            perror("Failed to allocate array of arrays: ");
            return EXIT_FAILURE;
        }
    
        for (size_t i=0; i<r; ++i)
        {
            for (size_t j=0; j<c; ++j)
            {
                if (fscanf(fp, "%lf", number[i]+j) != 1)
                {
                    fprintf(stderr, "Failed to parse int at %zu,%zu", i, j);
                    return EXIT_FAILURE;
                }
            }
        }
    
        for (size_t i=0; i<r; ++i)
        {
            for (size_t j=0; j<c; ++j)
                printf("%lf ", number[i][j]);
            fputc('\n', stdout);
        }
    
        free(number);
    
        return(0);
    }
    

答案 1 :(得分:0)

您正在声明一个整数:

int number;

并且您正在使用malloc分配内存,假设它是一个多维数组,然后尝试以相同的方式访问其元素。 将声明更改为:

int **number;

答案 2 :(得分:0)

它不是

  

(INT)的malloc(R C 的sizeof(int)的)

  

(int *)malloc(r c sizeof(int))

另一个错误是您无法以

的形式访问元素
  

温度=数[i] [j];

将其替换为

  

温度=数[I * R + j]的

希望这有帮助

答案 3 :(得分:0)

number = (int)malloc(r * c * sizeof(int));

在C中,永远不会转换malloc的结果。如果你把演员阵容遗漏到了int,你会在这里有一个诊断,告诉你这个数字不是指针类型。

你可以这样做:

int* number = malloc(r * c * sizeof(int));

但是这会给你一个大的单维数组。你需要像这样取消引用它:

temp = number[i * c + j];

如果你想要二维索引,就好像你已经这样声明了它:

int number[r][c];

您需要分两个阶段进行分配:

int** number = malloc(r * sizeof(int*));
number[0] = malloc(r * c * sizeof(int));
for (int i = 1 ; i < r ; i++)
{
    number[i] = &number[0][i * c];
}

设置了一个大的int数组和一个指向每行的int的中间指针数组。现在你可以做到

temp = number[i][j];

修改

或者你可以做Dmitri所说的:

int (*number)[c] = malloc(r * c * sizeof(number[0][0]));

实际上,它可以一次性地对一组r个块进行malloc。