Cuando uso malloc y hago una manipulación de memoria similar, ¿puedo confiar en que sizeof (char) siempre es 1?¿Es necesario multiplicar por sizeof (char) al manipular la memoria?
Por ejemplo, necesito asignar memoria para N elementos del tipo char
. Se multiplica por sizeof(char)
necesario:
char* buffer = malloc(N * sizeof(char));
o puedo confiar en sizeof (char) siempre es 1 y omita la multiplicación
char* buffer = malloc(N);
entiendo por completo que sizeof
se evalúa durante la compilación y luego el compilador incluso podría compilar la multiplicación y, por lo tanto, la penalización de rendimiento será mínima y muy probablemente cero.
Estoy preguntando principalmente sobre la claridad del código y la portabilidad. ¿Es esta multiplicación alguna vez necesaria para char
tipo?
Este argumento de "facilidad para cambiar el código" es bull. 'sizeof()' tiene 8 caracteres.Tener que agregarlo porque alguien no escribió 'sizeof (char)' y luego el tipo cambiado a 'wchar_t' no le dará a nadie túnel carpiano, y si le preocupa esto, debería usar' sizeof * buf' de todos modos porque te ahorra incluso _less_ tipando. –
@ChrisLutz, estoy viendo el estándar C11 y no veo ninguna cláusula que específicamente diga 'sizeof (char)' es una. Según [wikipedia] (http://en.wikipedia.org/wiki/C_data_types#Basic_types), puede ser cualquier cosa: _ "por ejemplo, todos los tipos pueden ser de 64 bits" _. ¿Podría decirme por favor en el estándar que dice eso? – Shahbaz
@Shahbaz - 6.5.3.4 párrafo 4: "Cuando' sizeof' se aplica a un operando que tiene el tipo 'char',' unsigned char', o 'signed char', (o una versión calificada de los mismos) el resultado es 1. " Por lo tanto, siempre ha sido así, siempre lo será. El 'char' es el" byte "de C. Desde la perspectiva del lenguaje, no importa cuántos bits sea un' char', es la unidad completa más pequeña y todos los valores 'sizeof' se dan en términos de' char 's en lugar de" bytes "(que no existen correctamente en el estándar C). Si todos los tipos son de 64 bits, 'sizeof (char) == sizeof (short) == sizeof (int) == sizeof (long) == 1', no 8. –