Почему strcpy работает, когда размеры массивов неизменны, C
Итак, я поступил на курс начального уровня в моем университете, и мой профессор упомянул, что размеры массивов нельзя изменить, потому что они установлены в памяти.
Кроме того, эти строки в C являются просто массивами символов.
Итак, мой вопрос: как можно копировать строки различной длины с помощью strcpy, если сами длины не могут быть изменены?
(В настоящее время 2:30 и экзамен через 1 день)
Извинения, это вопрос новичка, но любая помощь очень ценится! Спасибо:)
1 ответ
Ответ прост: факты не меняются, даже если мы копируем строку, используя strcpy
, После объявления размер массива не изменится. На самом деле предположим, что у вас есть массив символов
char arr[]="helloworld"; //size of the array will be 11
strcpy(arr,"funny");
Каков размер массива? Это так же, как когда объявлено. 11
, Это не изменилось от оригинала.
Какова длина строки? Это 5
сейчас.
Строка - массив символов с нулевым символом в конце. Это означает, что массив может иметь 100
элементы, но строка будет состоять из нескольких символов, заканчивающихся нулем, и это может быть что угодно, например 2
длина или 5
длина или все, что возможно, учитывая, что у нас есть место для хранения \0
,
Копирование строки не означает изменения размера массива.
Также обратите внимание на одну вещь - строки - это не просто массив символов, это NUL-терминатор в конце этих символов, что делает его строкой.
char s[4]="hell";
Это допустимый код C, и это не строка. Там нет места для \0
, Вы не можете использовать его со стандартными функциями библиотеки строк. Дело в том, что это не будет работать с такими функциями, как strcpy
, strlen
и т. д. Потому что эти реализации зависят от массива символов, которые должны быть завершены, чтобы работать должным образом.
Остерегайтесь последнего примера, показанного в уме - написание этого - неопределенное поведение.
char s[4]="hell";
size_t len = strlen(s);
Нет, ты не можешь этого сделать. strlen
ожидает чего-то, а ты этого не дал. Таким образом, правильный способ сказать, что вещи будут...(Вот хорошая описательная цитата, я не помню источник)
В c строка не является внутренним типом. C-строка - это соглашение, чтобы иметь одномерный массив символов, который заканчивается нулевым символом,
'\0'
,
1) Не помню источник цитаты: если кто-нибудь, дайте мне знать. Я держал это в файле.(Не первоисточник)