1

Тема: strnlen та вказівник на char

Якщо записати ось так:

    char src[] = "1234567890";
    printf("%zu\n", strnlen(src, sizeof(src)));

то отримаємо правильну довжину рядка.

А якщо ось так:

    char* src = "1234567890";
    printf("%zu\n", strnlen(src, sizeof(src)));

то довжина рядка чомусь обмежується 8.
Тобто до 8 включно правильно визначається,
а далі лише 8.

Чому так?
Ця ж функція наче спеціально зроблена,
щоб контролювати наявність '\0' в кінці рядка.

2

Re: strnlen та вказівник на char

Знаєте різницю між char[] та char*?

Подякували: Teg Miles1

3

Re: strnlen та вказівник на char

wander написав:

Знаєте різницю між char[] та char*?

char[] — це масив, а інший — це вказівник.
Але ж в масиві там теж вказівник на перший елемент.

4

Re: strnlen та вказівник на char

Teg Miles написав:

Але ж в масиві там теж вказівник на перший елемент.

Що? *SCRATCH*

5 Востаннє редагувалося Torbins (06.08.2025 21:15:08)

Re: strnlen та вказівник на char

Teg Miles написав:
wander написав:

Знаєте різницю між char[] та char*?

char[] — це масив, а інший — це вказівник.
Але ж в масиві там теж вказівник на перший елемент.

Байдуже що там під капотом, головне що sizeof отримує на вхід зовсім різні типи. Якщо компілюєте в 64 біта, то розмір вказівника буде вісім байт. Саме це значення поверне sizeof і воно стане максимальним можливим значенням strnlen.

Подякували: Teg Miles, koala, HetmanNet, flatliner, leofun015

6

Re: strnlen та вказівник на char

Розібрався sizeof для char[] повертає кількість елементів у масиві,
а для char* (бо це вказівник) розмір типу на який він вказує. Звідси і 8, тобто 8 байтів, а не елементів.

7

Re: strnlen та вказівник на char

Teg Miles написав:

Розібрався sizeof для char[] повертає кількість елементів у масиві

Нє-а, не кількість елементів, а розмір.

Подякували: leofun011

8

Re: strnlen та вказівник на char

wander написав:
Teg Miles написав:

Розібрався sizeof для char[] повертає кількість елементів у масиві

Нє-а, не кількість елементів, а розмір.

А так, це ж strnlen має повертати кількість елементів.

9

Re: strnlen та вказівник на char

Teg Miles написав:

Але ж в масиві там теж вказівник на перший елемент.

sizeof - один з рідкісних випадків, коли масив не перетворюється на покажчик на перший елемент.

int x[10];
if(x==&x[0]){/*true*/}
if(sizeof x == sizeof &x[0]){/*false*/}
Подякували: Teg Miles1