Ошибка сегментации: выделение стека в программе на C в Ubuntu, когда буфер> 4M

Вот небольшая программа для задачи колледжа:

#include <unistd.h>

#ifndef BUFFERSIZE
#define BUFFERSIZE 1
#endif

main()
{
    char buffer[BUFFERSIZE];
    int i;
    int j = BUFFERSIZE;

    i = read(0, buffer, BUFFERSIZE);

    while (i>0)
    {
        write(1, buffer, i);
        i = read(0, buffer, BUFFERSIZE);
    }

    return 0;
}

Вместо этого есть альтернатива, использующая функции stdio.h fread и fwrite.

Что ж. Я скомпилировал обе эти версии программы с 25 различными значениями размера буфера: 1, 2, 4, ..., 2 ^ i с i = 0..30

Вот пример того, как я его скомпилирую: gcc -DBUFFERSIZE = 8388608 prog_sys.c -o bin / psys.8M

Вопрос: На моей машине (Ubuntu Precise 64, больше подробностей в конце) все версии программы работают нормально: ./psys.1M <data

(данные представляют собой небольшой файл с 3-строчным текстом ASCII.)

Проблема: Когда размер буфера составляет 8 МБ или больше. Обе версии (используя системный вызов или функции clib) аварийно завершают работу с этими размерами буфера (Ошибка сегментации).

Я проверял много вещей. Первая версия кода была такой: (...) main () {char buffer [BUFFERSIZE]; int i;

    i = read(0, buffer, BUFFERSIZE);
(...)

Это вылетает, когда я вызываю функцию чтения. Но с этими версиями:

main()
{
    char buffer[BUFFERSIZE]; // SEGMENTATION FAULT HERE
    int i;
    int j = BUFFERSIZE;

    i = read(0, buffer, BUFFERSIZE);


main()
{
    int j = BUFFERSIZE; // SEGMENTATION FAULT HERE
    char buffer[BUFFERSIZE];
    int i;

    i = read(0, buffer, BUFFERSIZE);

Оба они вылетали (SEGFAULT) в первой строке main. Однако, если я переместу буфер из main в глобальную область (таким образом, выделение в куче вместо стека), это работает нормально:

char buffer[BUFFERSIZE]; //NOW GLOBAL AND WORKING FINE
main()
{
    int j = BUFFERSIZE;
    int i;

    i = read(0, buffer, BUFFERSIZE);

Я использую Ubuntu Precise 12.04 64bit и Intel i5 M 480 1-го поколения.

#uname -a
Linux hostname 3.2.0-34-generic #53-Ubuntu SMP Thu Nov 15 10:48:16 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux

Я не знаю ограничений ОС для стека. Есть ли способ разместить большие данные в стеке, даже если это не очень хорошая практика?

Ответы на вопрос(2)

Ваш ответ на вопрос