Присвоение массива char структуре с приведением типа - PullRequest
1 голос
/ 22 февраля 2020

Я работаю над своим C программным кодом для выделения памяти без использования malloc(). Мой друг использовал связанный список для управления памятью, и я делаю это в этом примере, но я не знаю, как этот тип назначения работает в функции memory_init().

Вот основной пример теста:

#include <string.h> 
int main() {   
  char region[50];   
  memory_init(region, 50);   
  char* pointer = (char*) memory_alloc(10);    
  if (pointer)     memset(pointer, 0, 10);   
  if (pointer)     memory_free(pointer);   
  return 0;
} 

и есть функция memory_init():

void memory_init(void *ptr, unsigned size) {    

    struct metadata *first;
    first=(struct metadata*)ptr;
    first->next=NULL;
    first->prev=NULL;
    if (size > sizeof(struct metadata)) first->value=(size - sizeof(struct metadata));
    else first->value=0;
    first->boo=-1;
    zac=first;
}

, и там также используется структура:

struct metadata{        
    short boo;      // if -1 free, if 1 memory used
    unsigned value; //size of memory block
    struct metadata *next; 
    struct metadata *prev;  
};

Так что я не знаю, как эта часть код работает:

first=(struct metadata*)ptr;

При том, что я вижу, он принимает массив символов, отправленный в функцию, перепечатывает его в структуру и присваивает его, но я не знаю, как такое назначение работает? Он присваивает адрес памяти или что-то, потому что я не понимаю, как я могу перепечатывать char в struct. В основном я хотел бы знать, что там происходит.

Ответы [ 2 ]

2 голосов
/ 22 февраля 2020

у вас есть память; каждый байт памяти имеет адрес.

Изначально у вас есть void *ptr, который содержит адрес некоторого байта в памяти.

Когда вы делаете first=(struct metadata*)ptr;, вы сообщаете компилятору, что теперь я угрожаю памяти под ptr, как будто эта память содержит struct metadata, и вы используете first для доступа к этой памяти. необработанная область памяти.

0 голосов
/ 22 февраля 2020

Я не уверен, что понимаю, что вы спрашиваете, но "ptr" - это указатель на void, а "first" - это указатель на структуру "metadata". Так что "(struct metadata *)" используется в качестве приведения.

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