2013-05-03 8 views
12

In particolare, il seguente è ben definito o presenta un comportamento non definito?Posso passare un puntatore nullo a memcmp?

memcmp(0, 0, 0); 

Questo differisce tra C e C++? Idealmente, si prega di fornire una citazione dallo standard (s).

+0

Questo funziona? Leggerai memoria da NULL, non vedo come potrebbe funzionare – Eric

+2

Premi il pulsante di chiusura troppo presto. Si tratta di 'memcmp', non' memcpy'. Votazione per riaprire. –

+3

@Eric I puntatori non dovrebbero essere sottoposti a dereferenziazione se il parametro 'count' è' 0'. Ma detto questo, la domanda chiede se lo standard garantisce questo comportamento, di cui non conosco la risposta. – Praetorian

risposta

30

In particolare, il seguente è ben definito o presenta un comportamento non definito?

Non è definito. C99 7.21.1/2 dice di tutte le funzioni di stringa:

A meno che non esplicitamente dichiarato al contrario nella descrizione di una particolare funzione in questa sottoclausola, argomenti puntatore su una tale chiamata devono ancora avere valori validi

e la descrizione di memcmp in 7.21.4.1 non indica esplicitamente altrimenti.

Questo differisce tra C e C++?

No, C++ definisce C per la definizione delle funzioni di libreria C e non ha nulla di speciale da dire su memcmp.

+0

La rilevanza della seconda citazione è resa più chiara dal contesto principale: 'Quando un argomento dichiarato come size_t n specifica la lunghezza dell'array per una funzione, n può avere il valore zero su una chiamata a quella funzione. Salvo diversamente specificato esplicitamente ... ' – user295691

+0

Accettato e grazie. Ancora una domanda: il "valore valido" per un puntatore significa davvero "non nulla"? C'è una citazione in tal senso? – avakar

+2

@avakar: Sì, se vuoi davvero seguire lo standard fino alla fine amara, allora la mia citazione fa riferimento a 7.1.4 per la definizione di "valido" e che include specificamente "un puntatore nullo" in un elenco di esempi di valori "non validi" per le funzioni di libreria. –