Estoy en el proceso de aprender C. Tengo un método que requiere 3 cadenas y las combina para realizar algunas operaciones. A continuación fue mi primera implementación usando un compilador de GCC.Manipulación de cadenas y asignación de memoria - C
void foo(const char *p1, const char *p2, const char *p3)
{
size_t length = strlen(p1) + strlen(p2) + strlen(p3);
char combined[length + 1];
memset(combined, 0, length + 1);
strcat(combined, p1);
strcat(combined, p2);
strcat(combined, p3);
printf("Result : %s", combined);
}
int main()
{
foo("hello ", "world ", "how");
return 0;
}
Esto funciona bien. Pero cuando compilé esto usando, cc -Wall -pedantic -g foo.c -o foo
, comencé a recibir advertencias como ISO C90 forbids variable length array ‘combined’
. MSVC no estaba compilando este código. Se ha cambiado el código como
void foo(const char *p1, const char *p2, const char *p3)
{
size_t length = strlen(p1) + strlen(p2) + strlen(p3);
char *combined = (char *) malloc(length + 1);
memset(combined, 0, length + 1);
strcat(combined, p1);
strcat(combined, p2);
strcat(combined, p3);
printf("Result : %s", combined);
free(combined);
}
Preguntas
- Es esta la aplicación correcta?
- Si las matrices de longitud variable no son parte del estándar, ¿por qué GCC lo implementó? Si se espera que el código se compile solo en GCC, el uso de matrices de variables será una mejor alternativa que el uso de malloc.
- Creo que la regla del pulgar es que, si la memoria requerida es conocida en tiempo de compilación, use matrices o use malloc para asignar la memoria requerida. ¿Es esto correcto?
- Mi código se espera compilar en GCC y MSVC. Desarrollaré en GCC generalmente. Entonces, ¿cuáles son los indicadores del compilador que garantizan la máxima portabilidad? Actualmente estoy usando
-Wall -pedantic
. ¿Debo usar también-ansi
? ¿Cuáles serían las banderas equivalentes disponibles en MSVC? - ¿Cuáles son las otras cosas comunes a considerar cuando se escribe código C portátil?
Ver http: // stackoverflow.com/questions/3093049/different-behavior-of-compilers-with-array-allocation – PeterK
(1) Sí, como mencionó en el punto 3 (2) Porque gcc también es compatible con otras normas además de ISO C90. (5) http://www.google.com/search?q=writing+portable+C+code Siempre es mejor asignar dinámicamente VLA porque puede verificar el valor de retorno de (m/c) alloc a vea si la asignación fue exitosa o no – itisravi
@itisravi - Debe responder, en lugar de responder en un comentario. Debido a las restricciones de longitud de los comentarios, su recomendación sobre VLAs frente a la asignación dinámica es un poco escasa. Estoy de acuerdo con eso, y sé a lo que te refieres, pero no está claro porque los comentarios son demasiado cortos para las respuestas. Es por eso que tenemos respuestas. ;) –