Подтвердить что ты не робот

Размер vs Strlen

#include "stdio.h"
#include "string.h"

main()
{

    char string[] = "october"; // october is 7 letters

    strcpy(string, "september"); // september is 9 letters

    printf("the size of %s is %d and the length is %d\n\n", string, sizeof(string), strlen(string));

    return 0;
}

Вывод:

размер сентября составляет 8, а длина равна 9

Что-то не так с моим синтаксисом или что?

4b9b3361

Ответ 1

sizeof и strlen() делают разные вещи. В этом случае ваша декларация

char string[] = "october";

совпадает с

char string[8] = "october";

поэтому компилятор может сказать, что размер string равен 8. Он делает это во время компиляции.

Однако strlen() подсчитывает количество символов в строке во время выполнения. Итак, после вызова strcpy(), string теперь содержит "сентябрь". strlen() подсчитывает символы и находит 9 из них. Обратите внимание, что вы не выделили достаточно места для string для хранения "сентябрь". Это поведение undefined.

Ответ 2

Результат корректен, потому что

размер строки первой строки был выделен компилятором, который равен 7 + 1 (октябрь имеет 7 байтов и 1 байт для нулевого терминатора во время компиляции)

Второй оператор: вы копируете сентябрь (строка от 9 до 8 байтов);

там у вас есть размер сентября как 8 байт (все еще strlen() не будет работать в сентябре, он не имеет нулевого символа)

Ответ 3

Ваш целевой массив равен 8 байтам (длина "октябрь" плюс \0), и вы хотите разместить 9 символов в этом массиве.

man strcpy говорит: Если строка назначения strcpy() недостаточно велика, все может произойти.

Скажите, пожалуйста, что вы действительно хотите сделать, потому что это плохо пахнет.

Ответ 4

Вы должны устранить проблему переполнение буфера в этом примере. Один из способов сделать это - использовать strncpy:

memset(string, 0, sizeof(string));
strncpy(string, "september", sizeof(string)-1);