При возврате длины и размера пустой строки в C значения различаются. Почему это так?
Если массив не имеет статической длительности хранения, он не содержит даже пустую строку. Он просто неинициализирован и имеет неопределенную ценность. Поэтому использование функции strlen
приводит к неопределенному поведению.
Обратите внимание на то, что эти вызовы
printf("String Length: %d", strlen(b));
printf("String Size: %d", sizeof(b));
имеют неопределенное поведение, поскольку используются неверные спецификаторы преобразования. Вы должны использовать %zu
вместо %d
.
Вы можете объявить массив как
char b[7] = "";
или как
char b[7] = { '\0' };
или даже как
char b[7] = { [6] = '\0' };
В этих случаях массив действительно содержит пустую строку, и функция strlen
вернет 0.
В любом случае функция strlen
и оператор sizeof
возвращают разные значенияпоскольку функция strlen
не считает конечный ноль строки, хранящейся в массиве.
Рассмотрим следующую демонстрационную программу
#include <stdio.h>
#include <string.h>
int main(void)
{
char s[] = "Hello";
printf( "strlen( s ) = %zu\n", strlen( s ) );
printf( "sizeof( s ) = %zu\n", sizeof( s ) );
return 0;
}
Ее вывод
strlen( s ) = 5
sizeof( s ) = 6