2014-02-13 2 views
1

У меня есть часть кода, которая получает номер от пользователя, а затем выделяет целочисленный массив заданного размера. Однако это приводит к ошибкам в количестве 5 000 000. Вот оно:Случайная ошибка сегментации от printf(), может кто-нибудь объяснить?

#define LINELEN 32 

int main(int argc, char *argv[]) 
{ 
    int n; 

    char buffer[LINELEN]; 
    fprintf (stderr, "n? "); 
    fgets (buffer, LINELEN, stdin); 
    n = atoi(buffer);  

    int vector [n]; 
    printf("hi\n"); 
} 

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

int main(int argc, char *argv[]) 
{ 
    int n; 

    char buffer[LINELEN]; 
    fprintf (stderr, "n? "); 
    fgets (buffer, LINELEN, stdin); 
    n = atoi(buffer);  

    int vector [n]; 

} 

Может кто-то пожалуйста, помогите мне? Спасибо

редактировать: LINELEN и ошибочный аргумент PRINTF

также, я думаю, что это что-то делать со значением переполненной стека. Может просто потребоваться динамическое распределение при этих размерах

+0

делить значение 'LINELEN' – MOHAMED

+0

Почему у вас есть 0 в качестве аргумента? Вы можете просто напечатать строку самостоятельно. В противном случае он должен быть частью вашей форматированной строки. 'Е ("привет \ п"); printf («hi \ n% d», 0); «Я сомневаюсь, что это причина сбоя seg. –

+0

@remyabel, я думаю, нет проблем с 'printf (" hi \ n ", 0);'. Если указан какой-либо указанный формат, это приведет к сбою seg. – Jeyaram

ответ

2

Ошибка сегментации вызвана stack overflow, потому что int vector [5000000]; слишком большой для стека.

Если линии printf нет, возможно, компилятор оптимизировал линию int vector [n];, так как это конец программы.

+0

Хорошо, вот что я подозревал. Я просто динамически выделяю его тогда. благодаря – Cocksure

Смежные вопросы