2012-01-09 6 views
-7

Я хочу знать, как мы можем выделить блок памяти в времени выполнения на C или C++ без использования функций malloc и calloc.Выделить память во время выполнения

+0

См. Соответствующий вопрос: http://stackoverflow.com/questions/655065/when-should-i-use-the-new-keyword-in-c – Naveen

+10

Вам нужно получить [хорошую книгу] (http: //stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list). – Xeo

+0

Возможно, вам придется пройти через некоторые учебные пособия. –

ответ

3

В C, используя VLA ...

/* fill an array, allocated dinamically without malloc, 
** with 1, 2, 3, 4, ... 
** then sum all of the values and print the result */ 
#include <stdio.h> 

void vlaalloc(size_t nmemb, size_t siz, void (*fx) (void *, size_t)) { 
    unsigned char data[nmemb * siz]; 

    fx(data, nmemb); 
} 

int arraysum(int *arr, size_t len) { 
    int val = 0; 
    for (size_t i = 0; i < len; i++) val += arr[i]; 
    return val; 
} 

void seq(void *data, size_t len) { 
    int *arr = data; 
    for (size_t i = 0; i < len; i++) arr[i] = i + 1; 
    printf("array sum is %d\n", arraysum(arr, len)); 
} 

int main(void) { 
    int n; 

    if (scanf("%d", &n) == 1) { 
    vlaalloc(n, sizeof (int), seq); 
    } 
} 

см code running at ideone

+0

+1 для ideone.com – AminM

6

В C используйте malloc. Не забудьте сделать free после использования.

В C++ используйте new и не забудьте указать delete. Или лучше, используйте std::vector, если вы хотите динамический массив.

+0

Извините, но я забыл упомянуть, что это нужно делать без malloc и calloc. –

+1

@AmitSharma: тогда вам нужно использовать API для платформы. 'malloc' является единственным переносным динамическим механизмом распределения в стандарте C. –

0

В C вы можете использовать:

malloc() 

в C++:

malloc() 
calloc() 

В C++ это лучше использовать новый-оператор.

+2

@Xeo: вопрос конкретно говорит о * распределении памяти * (не создавая объекты или примитивные значения). Поэтому указание «malloc» и 'calloc' для C++, конечно же, неверно (хотя возможно неполное). –

+2

@FrerichRaabe: У нас все еще есть 'new' для этого:' :: operator new (std :: size_t size) '. И вообще, в C++ вы * не * хотите выделить память. – Xeo

+0

'calloc' - это функция C, а не C++. –

0

Я неуверен вам ваш вопрос, но простой ответ использует

C:

malloc(); 

C++:

new 

это вернет указатель на память, и Операционная система позаботится о том, чтобы найти ее для вас.

2

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

int *a = malloc (sizeof(int) * block_size);

В C++ использовать new

int *a = new int[block_size];

Примечание: этот код использует сырые указатели. C++ 11 имеет лучшие указатели, такие как unique_ptr и shared_ptr. Как правило, рекомендуется использовать эти умные указатели над исходными указателями.

EDIT: OP нужен блок, поэтому я обновление кода

+3

В C не указывать возвращаемое значение 'malloc'. Литье, в лучшем случае, избыточно; и может скрыть ошибку, которую компилятор поймал бы в ее отсутствие. – pmg

+0

C++ 03 имеет 'auto_ptr', что не так хорошо, как' unique_ptr', но реализует автоматическую очистку. –

+0

@pmg: Спасибо, что указали это. OP должен учитывать это. –

1

Если меня не хватает точки вашего вопроса , как это было рекомендовано, вам просто нужно использовать стандартные конструкции языка C++: new и delete/delete [].

+0

новый и удалить использование malloc и бесплатно за кулисами. – ams

+0

Нет, они * возможно *. Но им это не обязательно. – Puppy

0

В C все распределение памяти выполняется через malloc (это в правилах), поэтому, если вы хотите что-то другое, кроме malloc, это зависит от того, какую платформу вы используете, и вы не говорите.

В Linux, mmap может делать то, что вы хотите. Без сомнения, в окнах есть что-то еще.

На некоторых системах вы можете получить его, не спрашивая, до тех пор, пока вы знаете, где все, но это в основном только для встроенных систем с использованием базовой (или нет) операционной системы.

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