Выделите память во время выполнения - PullRequest
0 голосов
/ 09 января 2012

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

Ответы [ 8 ]

6 голосов
/ 09 января 2012

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

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

3 голосов
/ 09 января 2012

В С, используя 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);
  }
}

см. код, работающий на ideone

2 голосов
/ 09 января 2012

В С использовать malloc()

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

В C ++ используйте new

int *a = new int[block_size];

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

РЕДАКТИРОВАТЬ: ОП нуждается в блоке, поэтому я обновляю код

2 голосов
/ 09 января 2012

Либо malloc в C, либо new в C ++.

1 голос
/ 09 января 2012

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

0 голосов
/ 09 января 2012

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

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

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

0 голосов
/ 09 января 2012

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

C:

malloc();

C ++:

new

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

0 голосов
/ 09 января 2012

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

malloc() 

в C ++:

malloc()
calloc()

В C ++ лучше использовать оператор new.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...