«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Почему `strlen` и `sizeof` дают разные результаты для строк на основе указателей и строк на основе массива в C?

Почему `strlen` и `sizeof` дают разные результаты для строк на основе указателей и строк на основе массива в C?

Опубликовано 16 ноября 2024 г.
Просматривать:483

Why do `strlen` and `sizeof` produce different results for pointer-based and array-based strings in C?

Различные выходные данные при вычислениях длины и размера строки для инициализации строк на основе указателей и массивов

Понимание результатов

При создании строки str1 на основе указателя и строки str2 на основе массива с одинаковым значением функции strlen и sizeof дают разные результаты. В частности, для объявлений:

char *str1 = "Sanjeev";
char str2[] = "Sanjeev";

strlen возвращает 7 как для str1, так и для str2, поскольку он измеряет длину последовательности символов, исключая нулевой терминатор (\0) в конце.

Однако sizeof дает разные значения:

  • sizeof(str1) возвращает 4, поскольку оценивает размер переменной-указателя, который обычно составляет 4 байта (32-битные системы).
  • sizeof(str2) возвращает 8, поскольку он определяет размер массива, который включает нулевой терминатор, в результате чего получается 8 байтов (7 символов 1 нулевой терминатор).

The Основное различие: тип данных и выделение памяти.

sizeof измеряет размер типа данных, а strlen измеряет длину последовательности символов. В случае str1 это указатель на символ, поэтому sizeof возвращает размер указателя. Для str2 это массив символов, поэтому sizeof возвращает размер всего массива, включая нулевой знак-терминатор.

Более подробно

Для демонстрации лучше различать, рассмотрите:

char str2[8];
strncpy(str2, "Sanjeev", 7);
char *str1 = str2;

Теперь и str1, и str2 указывают на один и тот же массив. Их значения strlen равны 7, но значения sizeof различаются:

  • sizeof(str1) равно 4 (размер указателя)
  • sizeof(str2) равно 8 (размер массива с нулевым терминатором )

Это пример того, как оценка размера зависит от базовой структуры данных.

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3