Ошибка "превышен лимит памяти" при сдаче программы на сайте Олимпиады - 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; }
Объяснение кода листинга программы
- Программа считывает два числа (n и d) из файла input.txt
- Выделяет память под массив arr размером n*sizeof(int)
- Считывает n чисел из файла input.txt и сохраняет их в массиве arr
- Если произошла ошибка при считывании числа, выводится сообщение об ошибке и программа завершается
- Если не удалось выделить память под массив, выводится сообщение об ошибке и программа завершается
- Если не удалось считать n или d из файла, выводится сообщение об ошибке и программа завершается
- Массив arr сортируется пузырьком
- Выделяется память под массив arr освобождается
- Файлы input.txt и output.txt закрываются
- Программа возвращает 0, завершая свою работу
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д