strlen() против sizeof() в C: понимание отличий и правильное использование
Что такое strlen()
В C strlen() возвращает количество символов в null-терминированной строке, не считая завершающий '\0'. Считает буквы, цифры, символы и пробелы.
Статья объясняет роль strlen(), sizeof() и причины их различий.
- Определение
strlen() - Определение
sizeof() - Примеры синтаксиса
- Ключевые отличия
Что такое sizeof()
Оператор sizeof выдаёт размер операнда в байтах. Для статических типов вычисляется на этапе компиляции, для массивов переменной длины — во время выполнения. Применяется ко всем типам C: примитивам, указателям, структурам, объединениям. Результат типа size_t — беззнаковое целое, достаточное для размера наибольшего объекта.
Так как размеры типов вроде int или double могут отличаться на 32- и 64-битных системах, sizeof обеспечивает переносимость.
Ключевые отличия
strlen()измеряет длину строки;sizeof()— память, занимаемую переменной или типом.- Только
strlen()учитывает завершающий'\0';sizeof()игнорирует содержимое. - Оба возвращают
size_t(обычно 64-битное беззнаковое на современных системах). strlen()— функция времени выполнения изstring.h;sizeof— унарный оператор времени компиляции.strlen()работает только с символьными массивами;sizeof— с любыми типами.
Синтаксис strlen()
size_t length = strlen(my_string);
my_string — символьный массив или указатель на null-терминированную строку.
Пример strlen()
#include <stdio.h>
#include <string.h>
int main() {
char strng[] = "January";
printf("Length of given string is: %zu\n", strlen(strng));
return 0;
}
Вывод:
Length of given string is: 7
Синтаксис sizeof()
1) sizeof(тип)
sizeof(type) выдаёт размер указанного типа.
#include <stdio.h>
#define my_sizeof(type) ((char*)(&type+1) - (char*)&type)
int main() {
double x;
printf("%zu", my_sizeof(x));
return 0;
}
Вывод: 8
2) sizeof(переменная)
Передайте имя переменной, чтобы получить её память.
#include <stdio.h>
int main() {
printf("sizeof(char) = %zu\n", sizeof(char));
return 0;
}
Вывод: sizeof(char) = 1
3) sizeof(выражение)
Оценивает размер типа выражения без вычисления его значения.
#include <stdio.h>
int main() {
char p = 'S';
double q = 4.65;
printf("Size of variable p : %zu\n", sizeof(p));
printf("Size of an expression : %zu\n", sizeof(p+q));
int a = (int)(p+q);
printf("Size of explicitly converted expression : %zu\n", sizeof(a));
return 0;
}
Вывод:
Size of variable p : 1 Size of an expression : 8 Size of explicitly converted expression : 4
Наглядное сравнение
| Характеристика | strlen() | sizeof() |
|---|---|---|
| Заголовочный файл | string.h | Не требуется (встроенный оператор) |
| Назначение | Длина строки (без null) | Размер типа или переменной в памяти |
| Тип возвращаемого значения | size_t | size_t |
| Время вычисления | Runtime (может проходить по строке) | Compile-time (кроме VLA) |
| Применимо к | Только символьные массивы или указатели на null-терминированные строки | Все типы данных и выражения |
Когда что использовать
strlen()— когда нужна логическая длина строки: для выделения буферов, извлечения подстрок, валидации ввода.sizeof()— когда нужен физический размер типа или переменной: при копировании памяти черезmemcpyили выделении блока для массива структур.- Помните:
sizeof(char)всегда 1 байт — базовая единица памяти в C. - Для строковых литералов
sizeof("hello")даёт 6 (5 символов + null), аstrlen("hello")— 5.
Следование этим правилам гарантирует эффективный, переносимый и поддерживаемый C-код.
Язык C
- Асбест против стекловолокна: ключевые различия, применение и безопасность
- Структуры против объединений в C: практическое руководство
- C# против C++: четкое сравнение особенностей, производительности и сценариев использования
- C против C++: ключевые отличия и когда что выбирать
- C против Java: подробное сравнение особенностей, истории и применения
- Python против JavaScript: ключевые отличия, особенности и выбор языка
- Python против Ruby: подробное сравнение особенностей, преимуществ и сценариев использования
- Двигатели постоянного и переменного тока: ключевые отличия и руководство по выбору
- Пайка (бразинг) vs Паяльник (солдеринг): ключевые отличия
- Двухтактные vs четырехтактные двигатели: ключевые отличия