Я хочу знать, как мы можем выделить блок памяти в времени выполнения на C или C++ без использования функций malloc
и calloc
.Выделить память во время выполнения
ответ
В 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);
}
}
+1 для ideone.com – AminM
В C используйте malloc
. Не забудьте сделать free
после использования.
В C++ используйте new
и не забудьте указать delete
. Или лучше, используйте std::vector
, если вы хотите динамический массив.
Извините, но я забыл упомянуть, что это нужно делать без malloc и calloc. –
@AmitSharma: тогда вам нужно использовать API для платформы. 'malloc' является единственным переносным динамическим механизмом распределения в стандарте C. –
В C вы можете использовать:
malloc()
в C++:
malloc()
calloc()
В C++ это лучше использовать новый-оператор.
@Xeo: вопрос конкретно говорит о * распределении памяти * (не создавая объекты или примитивные значения). Поэтому указание «malloc» и 'calloc' для C++, конечно же, неверно (хотя возможно неполное). –
@FrerichRaabe: У нас все еще есть 'new' для этого:' :: operator new (std :: size_t size) '. И вообще, в C++ вы * не * хотите выделить память. – Xeo
'calloc' - это функция C, а не C++. –
Я неуверен вам ваш вопрос, но простой ответ использует
C:
malloc();
C++:
new
это вернет указатель на память, и Операционная система позаботится о том, чтобы найти ее для вас.
При использовании 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 нужен блок, поэтому я обновление кода
В C не указывать возвращаемое значение 'malloc'. Литье, в лучшем случае, избыточно; и может скрыть ошибку, которую компилятор поймал бы в ее отсутствие. – pmg
C++ 03 имеет 'auto_ptr', что не так хорошо, как' unique_ptr', но реализует автоматическую очистку. –
@pmg: Спасибо, что указали это. OP должен учитывать это. –
В C все распределение памяти выполняется через malloc (это в правилах), поэтому, если вы хотите что-то другое, кроме malloc, это зависит от того, какую платформу вы используете, и вы не говорите.
В Linux, mmap может делать то, что вы хотите. Без сомнения, в окнах есть что-то еще.
На некоторых системах вы можете получить его, не спрашивая, до тех пор, пока вы знаете, где все, но это в основном только для встроенных систем с использованием базовой (или нет) операционной системы.
- 1. Память во время выполнения
- 2. Невозможно выделить память во время выполнения без использования malloc?
- 3. Память стека во время выполнения
- 4. Идентифицировать незапущенную память во время выполнения
- 5. OpenCV 2.4.5 память ошибок во время выполнения
- 6. Память передачи CUDA во время выполнения ядра
- 7. Память C++, выделенная во время компиляции
- 8. Openshift + Jenkins не может выделить память во время сборки
- 9. AccessViolationException во время выполнения
- 10. «Невозможно выделить память» (ошибка = 12)»ошибки во время выполнения приложения Java
- 11. Как выделить размер массива fortan Netcdf во время выполнения?
- 12. Как выделить элемент в транспортирторе во время выполнения
- 13. Выделить многомерный массив в D во время выполнения
- 14. изменить сборку во время выполнения?
- 15. Освободить Java-память для ОС во время выполнения.
- 16. Фатальная память ошибок из-за исчерпания во время выполнения
- 17. Как добавить память в кучу во время выполнения?
- 18. Почему динамическая память позволяет манипулировать массивами во время выполнения?
- 19. Освободить память во время выполнения, когда анимация воспроизводится через AnimationDrawable
- 20. У MATLAB заканчивается память во время выполнения программы
- 21. Выделения память для переменной Path бросает исключение во время выполнения
- 22. Как распределение динамической памяти выделяет память во время выполнения?
- 23. Могу ли я изменить память исполнителя Spark во время выполнения?
- 24. Создать Minidump исключающего диапазон во время выполнения выделяется память
- 25. Как хранить память, выделенную некоторым java-методом во время выполнения
- 26. Извлечение ZIP-файлов в память во время выполнения (.NET)
- 27. Не удается выделить память
- 28. TensorFlow: OOM во время выполнения
- 29. java увеличение xmx динамически во время выполнения
- 30. Прерывание во время исполнения во время выполнения
См. Соответствующий вопрос: http://stackoverflow.com/questions/655065/when-should-i-use-the-new-keyword-in-c – Naveen
Вам нужно получить [хорошую книгу] (http: //stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list). – Xeo
Возможно, вам придется пройти через некоторые учебные пособия. –