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