2016-12-15 13 views
1

Wie kann ich x innerhalb der free_x-Funktion deinitialisieren? Ich muss es tun, um zu einer API-Methode zu passen. Ich kann x sehr einfach deinitialisieren, indem ich ihm null gebe, aber ich muss es innerhalb der free_x-Funktion tun.Weisen Sie der Adresse eines Zeigers null zu

typedef struct 
{ 
    int field1; 
    void *field2; 
}my_struct; 

static my_struct var; 

int main(void) 
{ 
    void *x; 

    alloc_x(&x); 
    free_x(x); // x = NULL works but not allowed 

    return 0; 
} 

void alloc_x(void **param) 
{ 
    *param = (my_struct *)&var; 
} 

void free_x(void *param) 
{ 
    // how can I free param here? 
} 
+5

'* param = NULL;' .......?; – LPs

+2

* param = NULL sollte funktionieren –

+0

Die _Adresse_ des Zeigers? Oder die Adresse, auf die der Zeiger _points_ zu? – byxor

Antwort

2

Einfache Antwort: Ihr Code ist bereits vollständig, also nicht mehr.

Erläuterung: Sie reservieren keinen Speicher (auf einem Heap oder Stack oder anderswo), so dass nichts frei ist. Sie übernehmen keine Ressourcen, die zurückgegeben werden müssen, setzen alle Flags, die gelöscht werden müssen, oder inkrementieren alle Semaphore, die dekrementiert werden müssen.

Sie implementieren eine API, aber nur weil ist ein Funktionsprototyp, der nicht bedeutet, dass Ihre Implementierung irgendetwas tun muss, wenn es nicht nötig ist. Ändern Sie einfach den Kommentar, um zu erklären, dass nichts zu tun ist, und lassen Sie die Funktion leer.

void alloc_x(void **param) 
{ 
    *param = &var; // No need to cast here, just assign. 
} 

void free_x(void *param) 
{ 
    // Nothing allocated, taken, incremented, etc. in alloc_x, so ... 
    // nothing to free, release, decrement, etc. here in free_x. 
} 

Der Code, den die API verwendet wird erwartet, dass die Speicher hinter den param oder x Zeigern wurden nach dem Aufruf befreit haben, so sollte es nicht danach sowieso nichts mit seinen variablen tun. Es ist nicht dein Problem, wenn sie es tun, aber es wird dein Problem sein, wenn du mit der Variablen x des Anrufers herumschwirrst!

+0

Sie beantworten eine Frage, die nicht die Frage ist. Außerdem hat die Frage 'struct my_struct' einen internen Zeiger, so dass leicht erraten werden kann, dass andere 'malloc'ated-Speicher in' free_x'-Funktion 'frei' sein müssen. – LPs

+0

+1 Bang auf Ziel. Ich stimme zu, wir müssen in diesem Fall nichts tun. Wenn der Aufrufer x nach free_x (..) verwendet, ist das nicht dein Problem –

0

nur schreiben *param = NULL;

malloc gibt void * und frei nimmt void *, so einige Ihrer Würfe sind bedeutungslos, und du bist zu befreien immer einen void * auch wenn Sie beginnend mit einer anderen Art von Zeiger.

+0

Wenn ich schreibe * param = NULL, erhalte ich '' ausdruck muss ein modifizierbarer lvalue 'fehler! – sanchop22

0

Ich denke nicht, dass es möglich ist, ohne die Funktion alloc_x zu ändern. Eine mögliche Implementierung ist unten angegeben:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
typedef struct 
{ 
    int field1; 
    void *field2; 
}my_struct; 

static my_struct var; 

void alloc_x(void **param) 
{ 
    *param = malloc(sizeof(my_struct *)); 
    memcpy(*param,(my_struct *)&var,sizeof(my_struct *)); 
} 

void free_x(void *param) 
{ 
    free(param); 
    // how can I free param here? 
} 
int main(void) 
{ 
    void *x; 

    alloc_x(&x); 
    free_x(x); // x = NULL works but not allowed 

    return 0; 
} 
+0

Genau, aber ich darf nicht malloc und frei verwenden, weil wir auf einem mikrocontroller arbeiten und es ist nicht erlaubt, dynamische speicherzuweisungen sogar zu verwenden obwohl es möglich ist – sanchop22

+0

In diesem Fall kann ich fragen, warum Sie alloc_x und free_x überhaupt brauchen ?? Anstelle der Funktion warum nicht ein MACRO verwenden wie #define free_x (param) param = NULL –

+0

Weil ich die free_x Funktion implementieren muss Um mit einer API Funktion zu passen, muss ich die Funktion free_x (void * param) haben und x innerhalb der Funktion deinitialisieren – sanchop22

0

Ein wenig triky, aber Sie können tun

#include <stdio.h> 
#include <string.h> 

typedef struct 
{ 
    int field1; 
    void *field2; 
}my_struct; 

static my_struct var; 

void alloc_x(void **param) 
{ 
    *param = (my_struct *)&var; 
} 

void free_x(void *param) 
{ 
    memset(param, 0x00, sizeof(void *)); 
} 

int main(void) 
{ 
    void *x; 

    alloc_x(&x); 
    printf("Before: x=%p\n", x); 
    free_x(&x); 
    printf("After: x=%p\n", x); 

    return 0; 
} 

oder

void free_x(void *param) 
{ 
    my_struct **p = param; 

    *p = NULL; 
} 

Offensichtlich ist es nur gültig in mit void *

+0

Dies würde den Inhalt der var-Variablen ebenfalls zerstören.Nicht sicher, ob dies beabsichtigt ist .. –

+0

Dieses i Es ist nicht gut. Code, der versucht, * private * Werte in einem anderen Codeabschnitt zu ändern, ist entweder ein Programmfehler oder ein Fehler, der darauf wartet, ausgeführt zu werden. –

+0

@MikeofSST ist was Zeiger auf Zeiger soll verwendet werden ..... – LPs

Verwandte Themen