Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Выделение места в куче типа void для хранения данных любого типа

Хост Алма Мыслитель (7426), закрыт 1 год назад
Прошу скинуть мне пример создания буфера в куче типа void, чтобы можно было туда записывать данные любого типа.
Лучший ответ
Евгений Высочин Просветленный (37964) 1 год назад
#include<stdio.h>
#include<stdlib.h>

int main()
{
void *buf=(void*)malloc(25*sizeof(void));
if(!buf) exit(1);
char *word="my text from void buffer\0";
buf=word;
while(*(char*)buf)
printf("%c", *(char*)buf++);

free(buf);
return 0;
}
Антон ФАГМудрец (11310) 1 год назад
А можно немного позанудствовать?
1. sizeof(void) - так делать не надо, как максимум компилятор должен выдать ошибку, как минимум предупреждение(в gcc с опцией -Wpedantic). void является не полным типом.
2. buf=word - Текст все ещё в стеке, вы же просто присвоили переменной buf адрес word и формально идете по word.
3. Зачем char *word="my text from void buffer\0" <- здесь ноль, когда ноль там и так есть.
4. void *buf=(void*)malloc(25*sizeof(void));
любой указатель может быть приведен неявно к типу void *. У нас же Сишечка, а не кресты.
5. free(buf) <- ну, такое, у нас же он теперь указывает на word или нет???
Остальные ответы
Def Просветленный (36908) 1 год назад
void * buf = malloc(sizeof(MyType));
Хост АлмаМыслитель (7426) 1 год назад
а дальше?
DefПросветленный (36908) 1 год назад
А дальше, после использования:
free(buf);
Николай Веселуха Высший разум (360645) 1 год назад
 #include  
#include
#define COUNT 3
int main(void) {
size_t i;
void** ptr = (void**)malloc(COUNT * sizeof(void*));
for (i = 0; i < COUNT; ++i) ptr[i] = malloc(1);
char* name = "Maximov Boris";
int age = 28;
double temp = 36.5;
ptr[0] = (char*)name;
ptr[1] = (int*)&age;
ptr[2] = (double*)&temp;
printf("Name: %s\n", (char*)ptr[0]);
printf("Age: %i\n", *(int*)ptr[1]);
printf("Temperature: %.1lf\n", *(double*)ptr[2]);
free(ptr);
return 0;
}
Николай ВеселухаВысший разум (360645) 1 год назад
 #include  
#include
#include
#define COUNT 3
int main(void) {
char name[] = "Maximov Boris";
int age = 28;
double temp = 36.5;
void** ptr = (void**)malloc(COUNT * sizeof(void*));
size_t i;
for (i = 0; i < COUNT; ++i) {
switch (i) {
case 0: ptr[i] = name; break;
case 1: ptr[i] = &age; break;
case 2: ptr[i] = &temp; break;
}
}
for (i = 0; i < COUNT; ++i) {
switch (i) {
case 0: printf("Name: %s\n", (char*)ptr[i]); break;
case 1: printf("Age: %i\n", *(int*)ptr[i]); break;
case 2: printf("Temperature: %.1lf\n", *(double*)ptr[i]); break;
}
}
free(ptr);
return 0;
}
Сергей Гений (56227) 1 год назад
Ну к примеру так
Сама структура выделяет в чарах но вы об этом не знаете и используете как вам нужно. Смысл в том, что не важно какой тип выделения, важно как интерпретируете.
В том числе можно написать что-то вроде double* a = (double*)mem.create<int>(10).
Хранится в войд, создается в чар, передается в инт, конвертируется в дабл. Главное при этом следить за размером)
 #include 
using namespace std;

struct memmory

{
void* ptr;
int size;
template
T* create(int size)
{
ptr = new char[size*sizeof(T)];
return (T*)ptr;
}
};

int main()
{
memmory mem;
int* a = mem.create(10);
a[9] = 34;
cout << a[9];
}
Похожие вопросы