Frage

aus Java Ich bin durch die Verwendung von Void verwirrt einen Rückgabewert in der folgenden Eigenschaften ermöglicht:

void *emalloc(size_t s) {  
    void *result = malloc(s);  
    if (NULL == result) {  
        fprintf(stderr, "MEMORY ALLOCATION FAILURE\n");  
    exit( EXIT_FAILURE );  
    }  
    return result;  
}  

kehrt diese einen Zeiger auf ein Spannfutter von Speicher zugewiesen?

War es hilfreich?

Lösung

Ja, es ist. Ein void * Zeiger sind im Grunde ein allgemeiner Zeiger auf eine Speicheradresse, die dann in der Regel zu wie auch immer geartete Rolle festgelegt werden konnten, wurde tatsächlich gewünscht wird.

Andere Tipps

Ihre Frage zeigt an, dass Sie die die Funktion Rückgabetyp sind Verlesen. Es gibt einen großen Unterschied zwischen:

void foo( void ) {}

und

void *bar( void ) {}

foo () keine Argumente und gibt keinen Wert, während bar () ohne Argumente und gibt einen allgemeinen Zeiger. In C wird das Schlüsselwort void, um anzuzeigen, einen generischen Zeiger, und ein Objekt vom Typ void * verwendet wird, kann ohne Verlust von Informationen zu einem anderen Objekt Zeigertyp umgewandelt werden.

Ja, diese Funktion einen Zeiger auf reservierten Speicher einer bestimmten Größe zurückkehrt. Es ist anders in malloc in dem Sinne, dass es einen Zeiger auf Rückkehr ist garantiert. Bei einem Fehler wird die Anwendung beenden.

Ja. void* bedeutet Zeiger auf etwas, aber von keiner besonderen Art.

void bedeutet im Wesentlichen keine Art, so dass, wenn wir void * p; p ist ein Zeiger auf etwas, aber wir haben nicht gesagt, was passiert.

void ohne Zeiger ist nichts daher void foo (void) eine Funktion, die keine Argumente und gibt nichts zurück nimmt.

Und ja malloc gibt einen Zeiger zu einem gewissen Teil des Speichers, malloc nicht weiß, oder egal, welche Art des Gedächtnis hat, so ist es Rückgabetyp ungültig ist *

In Java gibt es keine Pointer-Arithmetik. Es denkt, das ist das, was Sie fragen. Zum Beispiel vorstellen, dass malloc einen Zeiger vom Typ int zurück

int* malloc(size_t size)
{
    //
}

Sie würde möglicherweise den Zeiger erhalten, der im Grunde ein Zeiger auf ein array ist. Dann würden Sie indizieren wie normale Arrays.

int* arr = malloc(10 * sizeof(int)); // 10 contiguous int(s).

Das Problem ist, dass C keine Funktionen Überlastung hat. Also müssen wir einen Weg finden, eine generische malloc zu schreiben. Andernfalls würden Sie mit einem anderen malloc für jede Art enden. Die Lösung ist die erforderliche Anzahl von Bytes zu senden, die Sie benötigen. Dann können Sie indizieren wie Sie wollen. Daraus ergibt sich eine größere Flexibilität und eine für alle Lösung.

int*  i = (int*)malloc(10 * sizeof(int)); // 40 bytes if int = 4 bytes
char* c = (char*)malloc(10 * sizeof(char)); // 10 bytes if char = 1 byte

int  thirdElement = i[3]; // third element. 12 bytes away from (*i)
char secondElement = c[2]; // second element. 2 bytes away from (*c)

Also, die ganze Idee ist, dass es keine Rolle spielt, wie wir Index der Erinnerung, die wir von malloc bekam. Alles, was wir tun müssen, ist die Art der neu erstellten Array-Index um es richtig zu spezifizieren. void* bedeutet, dass dies ein Zeiger in dem Speicher zu, dass wir nicht festgelegt haben, wie zu indizieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top