strcpy против прямого назначения: проблема переполнения - PullRequest
4 голосов
/ 25 апреля 2019

Это практический вопрос из моей школы, это не домашний вопрос:

Учитывая следующее объявление, напишите фрагмент кода C, который может привести к strlen(arr) возвращению не менее 8.

char arr[4];

Моя попытка ответить на этот вопрос такова: невозможно, нет способа достичь этого. Поскольку strlen будет возвращать число символов в массиве char до тех пор, пока он не встретит первый \ 0, я не вижу, что в любом случае мы можем позволить strlen вернуть 8 в этом случае. Я думаю, что если мы принудительно назначим для этого массива строку длиной 8, поведение не будет предсказуемым.

Однако, решение, которое дает наш инструктор:

strcpy(arr, Any 8-char-long string);

Например:

strcpy(arr, "Overflow");

Я не понимаю, почему это допустимо, в моем понимании, я не вижу, чтобы в этом массиве было достаточно места для хранения этой строки длиной 8, есть ли что-то, что я упускаю для понимания строки в C?

1 Ответ

3 голосов
/ 25 апреля 2019

"Учитывая следующее объявление, напишите фрагмент кода C, который может привести к тому, что strlen (arr) вернет не менее 8."

Это невозможно, так как arr может содержать только 3 символа и 1 нулевой терминатор.

Моя попытка ответить на этот вопрос: невозможно, нет способа добиться этого

Исправить.

Однако решение, которое дает наш инструктор: strcpy(arr, Any 8-char-long string);

Ваш инструктор некомпетентен и не должен преподавать C. Это запишет за пределы массиваи может произойти что угодно, в том числе программные сбои или программа , кажущаяся работающей как положено это время выполнения .

Я не понимаю, почему это такvalid

Это не так, он вызывает неопределенное поведение.

...