2017-02-08 3 views
1

Можно ли выделить массив в куче, даже если он ограничен внутри функции? Вот моя C программа:Как выделить массив большого размера (используя динамическое распределение памяти в куче) внутри функции

void SimpleTextEditor() 
    { 
     char textEditor[1000000]; 
     char operationText[1000002]; 
     //do something with the arrays 
    } 

Это приводит к исключению StackOverflow по очевидной причине, что я пытаюсь выделить два больших размеров массивов. Если я перемещаю любой из массивов вне функции и делаю ее глобальной (переменная уровня файла), то она работает, поскольку глобальные переменные выделяются в куче.

Но я не хочу, чтобы мои переменные были глобальными. Невозможно ли распределить память динамически для массивов с помощью malloc и calloc?

+0

'обугленного * TextEditor = таНос (1000000)' ... 'свободный (текстовый редактор);' –

+0

Вы можете использовать 'static'? –

+1

«... как глобальные переменные выделяются на кучу» - откуда у вас появилась эта идея? – AnT

ответ

2

Если переместить какой-либо один из массивов вне функции и сделать ее глобальной (переменная уровня файла), то она работает как глобальные переменные , выделенные на кучу.

Это ложное предположение. Массив, определенный в области файла, скорее всего, будет размещен в пределах data segment или, более конкретно, в сегменте .bss, поскольку явный инициализатор не указан.

Но я не хочу, чтобы мои переменные были глобальными. Невозможно ли динамически распределять память для массивов с помощью malloc и calloc?

Конечно, можно распределить память динамически, используя malloc и друзей. Однако, поскольку размеры известны во время компиляции, лучшей альтернативой может быть объявить как массивы static:

void SimpleTextEditor() 
{ 
    static char textEditor[1000000]; 
    static char operationText[1000002]; 
    //do something with the arrays 
} 
+2

Примечание: эта версия не является повторной и нитебезопасной. –

+0

Таким образом, переменная статического массива, даже если она локально привязана к функции, не переходит в область памяти стека. Это? – RBT

+0

@ RBT: Правильно. Он перейдет в сегмент данных, как глобальная переменная. Единственное различие касается области. –

2

Невозможно ли распределить память динамически для массивов с использованием malloc и calloc?

Конечно можно:

char *textEditor = malloc(1000000); 
char *operationText = malloc(1000002); 
//do something with the arrays 
free(operationText); 
free(textEditor); 

(примечание: вы можете использовать 1000000*sizeof(char), если вы хотите, но sizeof(char) всегда 1)

1

Это defineltly можно использовать malloc() и calloc() для выделения памяти динамически. Просто выделите их в функциях или main(), если вы не хотите сделать их глобальными. При работе с большими данными лучше всего выделять пространство в куче, просто вам нужно сделать больше места для большего количества данных.

  • При использовании malloc():

    malloc() выделяет запрошенные память в куче, а затем возвращает void* указатель на него.

    Пример:

    char *textEditor = malloc(1000000); 
    char *operationText = malloc(1000002); 
    
  • При использовании calloc():

    calloc() выделяет запрошенные память в куче, а затем возвращает void* указатель на него. Наборы памяти 0.

    Пример:

    char *textEditor = calloc(1000000, sizeof * textEditor); 
    char *operationText = calloc(1000002, sizeof * operationText); 
    
  • Обязательно безопасно free() их в конце.

    free() освобождает память, выделенную ранее malloc(), calloc() или realloc().

    Пример:

    free(textEditor); 
    textEditor = NULL; 
    
    free(operationText); 
    operationText = NULL; 
    

Примечание: Оба malloc() и calloc() может вернуться NULL на ошибку, поэтому лучше, чтобы проверить их. Вы проверяете, как это:

if (textEditor == NULL || operationText == NULL) { 
    /* handle exit */ 
+0

Будучи из C# фона разрешенный синтаксис для calloc 'char * textEditor = calloc (1000000, sizeof * textEditor);' для меня действительно странно.Я мог бы написать его как «char * textEditor = calloc (1000000, sizeof (char));» для ясности. – RBT

+1

@RBT Это тоже прекрасно. Я из C фона, поэтому я нахожу 'char * textEditor = calloc (1000000, sizeof * textEditor);' nice. Но они оба делают то же самое, без проблем, если вы выберете 'sizeof (char)'. – RoadRunner