Domanda

Quando si risponde a un commento di un'altra risposta di mine qui , ho trovato quello che penso possono essere un buco nello standard C (C1X, non ho controllato le precedenti e sì, lo so che è incredibilmente improbabile che io solo fra tutti gli abitanti del pianeta ho trovato un bug nel standard). Informazioni segue:

  1. Sezione 6.5.3.4 ( "L'operatore sizeof") para 2 stati "The sizeof operator yields the size (in bytes) of its operand".
  2. Para 3 del detto sezione:. "When applied to an operand that has type char, unsigned char, or signed char, (or a qualified version thereof) the result is 1"
  3. Sezione 7.20.3.3 descrive void *malloc(size_t sz) ma tutto ciò che dice è "The malloc function allocates space for an object whose size is specified by size and whose value is indeterminate". Non fa alcuna menzione a tutto quello che le unità sono utilizzati per l'argomento.
  4. Allegato E startes l'8 è il minimo rapporto qualità-CHAR_BIT così i caratteri possono essere più di un byte di lunghezza.

La mia domanda è semplicemente questa:

In un ambiente in cui un char è a 16 bit, si malloc(10 * sizeof(char)) allocare 10 caratteri (20 byte) o 10 byte? Punto 1 sopra sembra indicare precedente, punto 2 indica quest'ultimo.

Chiunque con più C-serie-fu di me ha una risposta per questo?

È stato utile?

Soluzione

In un ambiente a 16 bit char malloc(10 * sizeof(char)) assegnerà 10 chars (10 byte), perché se char è 16 bit, allora quel architettura / attuazione definisce un byte come 16 bit. Un char non è un ottetto, è un byte. Su computer più vecchi questo può essere più grande del 8 bit de facto di serie che abbiamo oggi.

La sezione pertinente dallo standard C segue:

  

3.6 Termini, definizioni e simboli

     

byte - unità indirizzabile di archiviazione dei dati abbastanza grande per contenere tutti i membri del set di caratteri di base dell'ambiente di esecuzione ...

     

NOTA 2 - Un byte è composto da una sequenza contigua di bit, il cui numero dipende dall'implementazione

.

Altri suggerimenti

Nel C99 standard rigorosi correlazione tra i byte, char e dimensioni dell'oggetto è data in 6.2.6.1/4 "raffigurazioni tipi - General":

  

Valori memorizzati negli oggetti non bit di campo di qualsiasi altro tipo di oggetto consistono di bit n × CHAR_BIT, dove n è la dimensione di un oggetto di questo tipo, in byte. Il valore può essere copiata in un oggetto di tipo unsigned char [n] (ad esempio, da memcpy); l'insieme risultante di byte è chiamata la rappresentazione dell'oggetto del valore.

Nella serie C ++ lo stesso rapporto è dato in 3,9 / 2 "Tipi":

  

Per qualsiasi oggetto (diverso da un classe base subobject) di tipo POD T, se l'oggetto contiene un valore valido di tipo T, i byte sottostanti (1.7) che costituiscono l'oggetto può essere copiato in un array di char o unsigned char. Se il contenuto della matrice di char o unsigned char viene copiato nuovamente dentro l'oggetto, l'oggetto deve poi tenere il suo valore originale.

C90 ci non sembra essere come detto esplicitamente correlazione, ma tra la definizione di un byte, la definizione di un carattere, e la definizione di operatore sizeof l'inferenza può essere fatto che un tipo char è equivalente a un byte.

Si noti inoltre che il numero di bit in un byte (e il numero di bit in un char) è Attuazione definito-a rigore non ha bisogno di essere di 8 bit. E onebyone sottolinea in un commento altrove che DSP comunemente hanno byte con un numero di bit che non è 8.

Si noti che RFC e standard IETF generale (? Sempre) utilizzare il termine 'octect' invece di 'byte' essere inequivocabile che le unità stanno parlando hanno esattamente 8 bit - né più né meno

Non sono le unità di "size_t sz" in qualunque sia l'unità indirizzabile della vostra architettura è? Lavoro con un DSP cui indirizzi corrispondono a valori a 32 bit, non su byte. malloc (1) mi fa un puntatore ad una zona di 4 byte.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top