10. Создание массивов

#include <stdio.h>

#define ARRAY_MAX_SIZE 2500
int array[ARRAY_MAX_SIZE];

Решение: не использовать такие массивы, особенно с выдуманными ограничениями по размеру никак не связанному с условием работ.

int n; // размер матрицы
float **read_matrix_from_file(char *filename)
{
    FILE *f = fopen(filename, "r");
    fscanf(f, "%d", &n);
    if (n <= 0) // "Error: negative size"
        exit(1);

    float **matrix = malloc(sizeof(float *) * n);
    for (int i = 0; i < n; i++)
    {
        matrix[i] = malloc(sizeof(float) * n);
        if (matrix[i] == NULL) // "Error: Memory allocation failed."
        {
            free(matrix);
            exit(1);
        }

        for (int j = 0; j < n; j++)
            if (!fscanf(f, "%float", &matrix[i][j])) // "Error: Invalid file format."
            {
                free(matrix);
                exit(1);
            }
    }
    fclose(f);
    return matrix;
}

int main(void)
{
    read_matrix_from_file("inputfile");
}
Вариант реорганизации и исправления кода
float **read_matrix_from_file(char *filename, int *n)
{
    FILE *f = fopen(filename, "r");
    if (fscanf(f, "%d", &n) != 1 && n <= 0) // "Error: negative size"
        return NULL;

    float **matrix = malloc(sizeof(float *) * *n);
    if (matrix == NULL)
    {
        return NULL;
    }
    for (int i = 0; i < n; i++)
    {
        matrix[i] = malloc(sizeof(float) * *n);
        if (matrix[i] == NULL)
        {
            for (int k = 0; k < i; ++k)
                free(matrix[k]);
            free(matrix);
            return NULL;
        }
        for (int j = 0; j < n; j++)
            if (!fscanf(f, "%f", &matrix[i][j]))
            {
                for (int k = 0; k < i; ++k)
                    free(matrix[k]);
                free(matrix);
                return NULL;
            }
    }
    fclose(f);
    return matrix;
}

int main(void)
{
    int n;
    read_matrix_from_file("inputfile", &n);
}

Last updated