Ошибка "превышен лимит памяти" при сдаче программы на сайте Олимпиады - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Здравствуйсте, помогите пожалуйста! Решил олимпиадную задачу, у меня на моем Ubuntu 14.04 + Geany компилируется и выводит правильный ответ, а на сайте пишет, что

превышен лимит памяти

. Программа легкая, выполняется за 0.001 секунды. Подозреваю, что ошибка - segmentation fault, т.к. пока делал программу пару раз выдавало, исправлял. Опции компиляторов: Мой: gcc -Wall -o "%e" "%f" -std=c99 На сервере: -O2 --std=gnu11 -m32 -lm
#include <stdio.h>
#include <stdlib.h>
 
int main(void){
    int tmp, n, d, res=0, i;
    int* arr;
    FILE* input;
    FILE* output;
    arr = (int*) malloc(n*sizeof(*arr));
    input=fopen("input.txt","r");
    output=fopen("output.txt","w");
    fscanf(input,"%d%d", &n, &d);
    for (i=0; i<n; i++){ 
        fscanf(input,"%d", &arr[i]);
    }
    //Сортировка массива пузырьком
    for(int c=0; c<(n-1); c++){
        for(int d=0; d<(n-c-1); d++){
            if(arr[d] > arr[d+1]){
                tmp=arr[d];
                arr[d]=arr[d+1];
                arr[d+1]=tmp;
            }
        }
    }
//Ошибка происходит до этого момента, если код, идущий дальше вырезать, то все нормально.
    free(arr);
    fclose(input);
    fclose(output);
    return 0;
}

Решение задачи: «Ошибка "превышен лимит памяти" при сдаче программы на сайте Олимпиады»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
 
int main(void) {
    int tmp, n, d, res = 0, i;
    int* arr;
    FILE* input;
    FILE* output;
    input = fopen("input.txt", "r");
    output = fopen("output.txt", "w");
    if ((NULL == input) || (NULL == output))
    {
        perror("");
        getchar();
        return 0;
    }
    if (fscanf(input, "%d %d", &n, &d) == 2)
    {
        arr = (int*)malloc(n*sizeof(int));
        if (NULL == arr)
        {
            printf("Failed to lock memory\n");
            getchar();
            return 0;
        }
        for (i = 0; i < n; i++)
            if (fscanf(input, "%d", &arr[i]) != 1)
            {
                printf("Error load 'arr[%d]' from input.txt\n", i);
                getchar();
                return 0;
            }
    }
    else
    {
        printf("Error load 'n' or 'd' from input.txt\n");
        getchar();
        return 0;
    }
    //Сортировка массива пузырьком
    for (int c = 0; c<(n - 1); c++) {
        for (int d = 0; d<(n - c - 1); d++) {
            if (arr[d] > arr[d + 1]) {
                tmp = arr[d];
                arr[d] = arr[d + 1];
                arr[d + 1] = tmp;
            }
        }
    }
    //Ошибка происходит до этого момента, если код, идущий дальше вырезать, то все нормально.
    free(arr);
    fclose(input);
    fclose(output);
    return 0;
}

Объяснение кода листинга программы

  1. Программа считывает два числа (n и d) из файла input.txt
  2. Выделяет память под массив arr размером n*sizeof(int)
  3. Считывает n чисел из файла input.txt и сохраняет их в массиве arr
  4. Если произошла ошибка при считывании числа, выводится сообщение об ошибке и программа завершается
  5. Если не удалось выделить память под массив, выводится сообщение об ошибке и программа завершается
  6. Если не удалось считать n или d из файла, выводится сообщение об ошибке и программа завершается
  7. Массив arr сортируется пузырьком
  8. Выделяется память под массив arr освобождается
  9. Файлы input.txt и output.txt закрываются
  10. Программа возвращает 0, завершая свою работу

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.286 из 5
Похожие ответы