Wenn ich malloc benutze und ähnliche Speichermanipulationen mache, kann ich mich darauf verlassen, dass sizeof (char) immer 1 ist?Ist es notwendig, beim Manipulieren des Speichers mit sizeof (char) zu multiplizieren?
Zum Beispiel muss ich Speicher für N Elemente des Typs char
reservieren. Ist Multiplikation mit sizeof(char)
notwendig:
char* buffer = malloc(N * sizeof(char));
oder kann ich mich verlassen sizeof (char) immer 1 sein und lassen Sie die Multiplikation
char* buffer = malloc(N);
ich völlig verstehen, dass sizeof
während der Kompilierung ausgewertet wird und dann dem Compiler könnte sogar die Multiplikation kompilieren und so wird die Leistungseinbuße minimal und höchstwahrscheinlich Null sein.
Ich frage hauptsächlich über Code Klarheit und Portabilität. Ist diese Multiplikation überhaupt notwendig für char
Typ?
Dieses Argument "Leichtigkeit des Änderns des Codes" ist Bulle. 'sizeof()' ist 8 Zeichen.Es muss hinzugefügt werden, weil jemand 'sizeof (char)' nicht geschrieben hat und dann der Typ, der in 'wchar_t' geändert wurde, niemandem mehr Karpaltunnel gibt, und wenn Sie betroffen sind, sollten Sie 'sizeof * buf' trotzdem verwenden weil es dir sogar _less_ tippt. –
@ChrisLutz, Ich schaue auf den C11-Standard und ich sehe keine Klausel die speziell sagt 'sizeof (char)' ist eins. Nach [wikipedia] (http://en.wikipedia.org/wiki/C_data_types#Basic_types) kann es alles sein: _ "Zum Beispiel können alle Typen 64-Bit sein" _. Könntest du mir bitte sagen, wo im Standard es so steht? – Shahbaz
@Shahbaz - 6.5.3.4 Absatz 4: "Wenn' sizeof' auf einen Operanden vom Typ 'char',' unsigned char' oder 'signed char' (oder eine qualifizierte Version davon) angewendet wird, ist das Ergebnis 1. " So war es immer, so wird es immer sein. Das "char" ist das "Byte" von C. Aus der Sprachperspektive ist es egal, wie viele Bits ein "char" ist, es ist die kleinste vollständige Einheit und alle "sizeof" -Werte sind in Form von "char" angegeben 's eher als" Bytes "(die im C-Standard nicht richtig existieren). Wenn alle Typen 64-Bit sind, 'sizeof (char) == sizeof (kurz) == sizeof (int) == sizeof (lang) == 1', nicht 8. –