Как типизировать указатель, чтобы адаптировать структуру переменных? - PullRequest
0 голосов
/ 05 февраля 2019

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

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

typedef struct node{
    void *data;
    struct node *next,*prev,*head,*tail;
}Node;

typedef Node *List;

void empty_list(List plist){
    Node *tmp,*phead;
    phead=direct_to_head(plist);
    while (phead->next!=NULL) {
        tmp=phead->next;
        if(tmp->data!=NULL){
            free(tmp->data);
            tmp->data=NULL;
        }
        free(phead);
        phead=tmp;
    }
    free(phead);
    phead=NULL;
    plist=NULL;
}

List init_list(unsigned int count,size_t size){

    if(count==0)
        fprintf(stderr,"node number can't be zero");
    Node *head,*tail;
    head=(Node *)calloc(count+2, sizeof(Node));
    if(head==NULL){
        fprintf(stderr, "No space in initing.");
        return NULL;
    }
    tail=head+count+1;
    head->tail=head+count+1;
    head->next=head+1;
    tail->head=head;
    tail->prev=tail-1;
    while (count>0) {
        head++;
        head->data=(void *)calloc(1, size);
        if(head->data==NULL){
            fprintf(stderr, "No space in initing.");
            return NULL;
        }
        head->head=head-count;
        head->tail=tail;
        head->next=head+1;
        head->prev=head-1;
        count--;

    }
    return (head->head)+1;
}

1 Ответ

0 голосов
/ 05 февраля 2019

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

free() не принимаетразмер, но только указатель.Таким образом, нет необходимости передавать размер памяти data точек на empty_list.


Для доступа к памяти data указывает, что вы хотите привести указатель к соответствующему типу, а затемразыменуйте его.

Если вы, например, сделали

Node * head = init_list(1, sizeof (int));

Вы можете получить доступ к данным головы, выполнив

*((int*) head->data) = 42;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...