Ошибка "превышен лимит памяти" при сдаче программы на сайте Олимпиады - 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, завершая свою работу
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д