Размер 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
Что-то не так с моим синтаксисом или что?
Ответы
Ответ 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);