Книга: Основы программирования в Linux

Простое выделение памяти

Простое выделение памяти

Вы можете выделить память с помощью вызова malloc из стандартной библиотеки С:

#include <stdlib.h>
void *malloc(size_t size);

Примечание

Имейте в виду, что ОС Linux (следующая требованиям стандарта X/Open) отличается от некоторых реализаций UNIX тем, что не требует включения специального заголовочного файла malloc.h. Кроме того, параметр size, задающий количество выделяемых байтов, — это не простой тип int, хотя обычно он задается типом беззнаковое целое (unsigned integer).

В большинстве систем Linux вы можете выделять большой объем памяти. Давайте начнем с очень простой программы из упражнения 7.1, которая, тем не менее, выигрывает соревнование со старыми программами ОС MS-DOS, поскольку они не могут обращаться к памяти за пределами базовой карты памяти ПК объемом 640 Кбайт.

Упражнение 7.1. Простое распределение памяти

Наберите следующую программу memory1.с:

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#define A_MEGABYTE (1024 * 1024)
int main() {
 char *some_memory;
 int megabyte = A_MEGABYTE;
 int exit_code = EXIT_FAILURE;
 some_memory = (char*)malloc(megabyte);
 if (some_memory ! = NULL) {
  sprintf(some_memory, "Hello Worldn");
  printf("%s", some_memory);
  exit_code = EXIT_SUCCESS;
 }
 exit(exit_code);
}

Когда вы выполните эту программу, то получите следующий вывод:

$ ./memory1
Hello World

Как это работает

Данная программа запрашивает с помощью библиотечного вызова malloc указатель на один мегабайт памяти. Вы проверяете, успешно ли завершился вызов malloc, и используете часть памяти, чтобы продемонстрировать ее наличие. Когда вы выполните программу, то увидите вывод фразы "Hello World", показывающий, что malloc действительно вернул мегабайт используемой памяти. Мы не проверяем наличие мегабайта целиком; мы приняли на веру программный код malloc!

Поскольку функция malloc возвращает указатель типа void*, вы преобразуете результат в нужный вам указатель типа char*. Эта функция возвращает память, выровненную так, что она может быть преобразована в указатель любого типа.

Простое основание — современные системы Linux применяют 32-разрядные целые и 32-разрядные указатели, что позволяет задавать до 4 Гбайт. Эта способность задавать адреса с помощью 32-разрядного указателя без необходимости применения регистров сегментов или других приемов, называется простой 32-разрядной моделью памяти. Эта модель также используется и в 32-разрядных версиях ОС Windows ХР и Vista. Тем не менее, никогда не следует рассчитывать на 32-разрядные целые, поскольку все возрастающее количество 64-разрядных версий Linux находится в употреблении.

Оглавление книги


Генерация: 1.464. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз