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).
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).
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
.
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
Accettato e grazie. Ancora una domanda: il "valore valido" per un puntatore significa davvero "non nulla"? C'è una citazione in tal senso? – avakar
@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. –
Questo funziona? Leggerai memoria da NULL, non vedo come potrebbe funzionare – Eric
Premi il pulsante di chiusura troppo presto. Si tratta di 'memcmp', non' memcpy'. Votazione per riaprire. –
@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