¿En C son equivalentes malloc (256) y malloc (sizeof (char) * 256)?

Veo que la gente a menudo escribe código C como:

char *ptr = malloc(sizeof(char)*256); 

¿Es eso realmente necesario? El estándar dice que sizeof(char)==1 por definición, así que no tiene sentido solo escribir:

 char *ptr = malloc(256); 

Gracias, Boda Cydo.

Sí, C define sizeof(char) como 1, siempre (y C ++ también).

No obstante, como regla general, aconsejaría algo como:

 char *ptr = malloc(256 * sizeof(*ptr)); 

De esta manera, cuando su jefe dice algo como: “Oh, BTW, acabamos de recibir un pedido de China, por lo que necesitamos manejar los tres alfabetos chinos lo antes posible”, puede cambiarlo a:

 wchar_t *ptr // ... 

Y el rest puede seguir igual. Dado que vas a tener alrededor de 10 millones de dolores de cabeza al tratar de manejar i18n, incluso a mitad de lo razonable, vale la pena eliminar incluso algunos. Eso, por supuesto, asume el caso habitual de que sus caracteres realmente están destinados a contener caracteres, si se trata de un búfer en bruto de algún tipo, y realmente desea 256 bytes de almacenamiento, independientemente de cuántos caracteres (de pocos) puede ser, probablemente debería seguir con el malloc(256) y terminar con él.

El problema ni siquiera debería existir. Deberías adoptar un lenguaje más elegante al escribir tus malloc ‘s como

 ptr = malloc(N * sizeof *ptr) 

Es decir, evite mencionar el nombre del tipo tanto como sea posible. Los nombres de tipo son para declaraciones, no para declaraciones.

De esa manera, sus malloc s siempre serán independientes de tipo y se verán consistentes. El hecho de que la multiplicación por 1 sea superfluo será menos obvio (ya que a algunas personas les resulta molesta la multiplicación por sizeof(char) ).

Son equivalentes, pero es bueno mantener la coherencia. También lo hace más explícito, por lo que es obvio lo que quieres decir. Si el tipo cambia alguna vez, es más fácil averiguar qué código debe actualizarse.

Eso puede ser cierto, pero solo es cierto para ese caso específico de char .

Personalmente, creo que es una buena forma usar el formulario malloc(sizeof(char) * 256) , porque alguien que cambia el tipo o copia el código para un propósito similar con un tipo diferente puede pasar por alto las sutilezas de ese caso.

Si bien no hay nada técnicamente incorrecto en escribir sizeof(char) , hacerlo sugiere que el autor no está familiarizado con C y el hecho de que sizeof(char) se define como 1. En algunos proyectos en los que he trabajado, en realidad buscamos ejemplos. de sizeof(char) como una indicación de que el código puede ser de baja calidad.

Por otro lado, ptr = malloc(count * sizeof(*ptr)); es una documentación muy útil y un lenguaje para evitar errores, y tiene sentido incluso si sizeof(*ptr) es 1. Sin embargo, debe ir precedido por if (count > SIZE_MAX/sizeof(*ptr)) { /* handle overflow */ } o tienes un error grave. Esto puede ser especialmente relevante cuando se asignan matrices de wchar_t o estructuras complejas de la misma longitud que una cadena de entrada, por ejemplo, al convertir una cadena UTF-8 en una cadena wchar_t o al construir una DFA para que coincida con la cadena.

Sí, son técnicamente equivalentes. Es solo una cuestión de estilo: usar sizeof para cada asignación hace que sea menos probable que lo pierda cuando realmente lo necesita.