2016-12-16 16 views
1

Question ist relevant. Ist memset Durchführung gültige Operation auf lptr->arrayMemset-Operation auf Doppelzeiger

Für die unter Darstellung

typedef struct List{ 

    void **array; // array of void* 
    int lastItemPosition; 
    int size; 
    }List; 

    #define INITIAL_LIST_SIZE 50 

createList führt, wie unten,

List *createList(List *list, Op opType){ 

    List *lptr = (List *)malloc(sizeof(List)); 

    if(opType == CREATE_NEW_LIST){ 

    lptr->array = malloc(INITIAL_LIST_SIZE*sizeof(void*)); 
    lptr->array = memset(lptr->array, NULL, INITIAL_LIST_SIZE*sizeof(void *)); 
    lptr->lastItemPosition = -1; 
    lptr->size = INITIAL_LIST_SIZE; 
} 

gezeigt?

+0

[Bitte lesen Sie diese Diskussion darüber, warum nicht der Rückgabewert von 'malloc()' und Familie in 'C' umgewandelt werden soll. (Http://stackoverflow.com/q/605845/2173917). –

Antwort

2

in Ihrem Code

memset(lptr->array, NULL, INITIAL_LIST_SIZE*sizeof(void *)); 

falsch ist, als das zweite Argument erwartet wird ein int zu sein, sind vorbei Sie einen Zeiger. Die Konvertierung ist ein stark von der Implementierung definiertes Verhalten, und in den meisten Fällen würde sie UB aufrufen.

Related unter Angabe C11 Kapitel §7.19

NULL
die zu einer Implementierung definiert Nullzeiger konstant erweitert; [...]

und Kapitel §6.3.2.3

eine ganzzahlige Konstante Ausdruck mit dem Wert 0 ist, oder ein solcher Ausdruck Guss void *, um zu Typ ist ein null pointer constant genannt.

So NULL ist der Zeigertyp, der mit einem int in jeder Hinsicht nicht kompatibel Typ ist.

+0

'#define NULL 0' in' stddef.h' – overexchange

+0

@overxchange zeigen Sie mir das gleiche in Kapitel 7.19, C11. –

+0

'NULL' muss nur einen Wert Null haben.Es kann jedoch einen Zeigertyp haben, in welchem ​​Fall es ungültig ist, wenn ein int erwartet wird (und nicht kompiliert wird). – Peter

1

Es ist auf allen wichtigen Plattformen gültig, mit einer Ausnahme: Übergeben Sie NULL nicht als den zu setzenden Wert. Denken Sie daran, dass die memset-Funktion auf den einzelnen Bytes des Speichers arbeitet, und Sie sollten alle Bytes auf Null setzen (0).

Es ist jedoch nicht streng technisch gültig. Auf den meisten Hauptplattformen ist ein Nullzeiger gleich Null. Aber muss es nicht sein. Die einzige vollständig tragbare und sichere Methode ist eine manuelle Schleife, bei der jeder Zeiger explizit auf NULL gesetzt wird.


Und wenn jemand interessiert ist auch zu wissen, wenn NULL als 0 definiert ist (oder ((void *) 0)) es keine Rolle spielt. Der Compiler übersetzt diese Null in die plattformspezifische Version eines Null-Zeigers, der etwas anderes als die tatsächliche Ganzzahl Null sein kann.

+0

Ich habe 'NULL' zur besseren Lesbarkeit behalten und gesagt, dass jedes' void * 'in' ** array' 'NULL' ist. – overexchange

+0

@overxchange Das könnte dazu führen, dass der Compiler eine Warnung über Konvertierungen vom Zeiger zum Nicht-Zeigertyp abgibt Definition von 'NULL'. –

+0

Können Sie jeden Fall aufzählen, in dem NULL! = 0 ist? Soweit ich verstehe, ist NULL nicht durch den Standard definiert, aber NULL == 0 ist so allgegenwärtig, dass es genauso gut sein kann. – doron

Verwandte Themen