- Да, это так.Там нет никаких конкретных нарушений стандарта.Однако
memset
- пустая трата времени, так как в любом случае его все равно перезаписывают (превратите свой первый strcat
в strcpy
).И вы должны всегда проверить, чтобы malloc
вернул NULL. Неважно, что! - C89 / 90 - это не текущий стандарт, а C99.И C1x не так уж далеко.GCC идет в ногу с кровоточащим фронтом.
- Используйте только локальные массивы, если они вам не нужны, чтобы выжить после окончания функции.В противном случае
malloc
- ваша лучшая ставка, особенно если вы хотите вернуть комбинированную строку. - Я думаю, что у gcc есть флаг
-std=c89
или что-то подобное.В любом случае MSVC не всегда следует стандарту: -) - Часто компилируйте и тестируйте его на обеих платформах.Это единственный способ быть уверенным.
Я бы выбрал:
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);
if (combined == NULL) {
printf("Result : <unknown since I could't get any memory>\n");
} else {
strcpy(combined, p1);
strcat(combined, p2);
strcat(combined, p3);
printf("Result : %s", combined);
free(combined);
}
}
или, поскольку вы на самом деле ничего не делаете со строкой, кроме ее печати:
void foo (const char *p1, const char *p2, const char *p3) {
printf("Result : %s%s%s", p1, p2, p3);
}
: -)
Другая стратегия, которую я видел, - это стратегия «только выделяй, если нужно»:
void foo (const char *p1, const char *p2, const char *p3) {
char str1k[1024];
char *combined;
size_t length = strlen (p1) + strlen (p2) + strlen (p3) + 1;
if (length <= sizeof(str1k))
combined = str1k;
else
combined = malloc (length);
if (combined == NULL) {
printf ("Result : <unknown since I couldn't get any memory>\n");
} else {
strcpy (combined, p1);
strcat (combined, p2);
strcat (combined, p3);
printf ("Result : %s", combined);
}
if (combined != str1k)
free (combined);
}
, которая использует стековое хранилище, если объединеноСтрока будет соответствовать и только выделяет память, если это не так.Это часто может привести к значительному повышению скорости, если основная масса струн объединится в меньшую величину, чем предел.