В этом C коде я определяю структуру, содержащую массив char длиной 4, за которым следует целое число. Затем я обновляю значение массива char с помощью sprintf
с массивами длиной 4 и 5.
struct myStruct
{
char str[4];
int num;
};
int main(int argc, char* argv[])
{
struct myStruct s = {"abcd", 0};
printf("%s %d\n", s.str, s.num);
sprintf(s.str, "efgh");
printf("%s %d\n", s.str, s.num);
sprintf(s.str, "ijklm");
printf("%s %d\n\n", s.str, s.num);
return 0;
}
Вывод:
abcd 0
efgh 0
ijklm 109
При обновлении s.str
с массивом длина 5 ("ijklm"
), он без ошибок переполняется до s.num
(109 - значение ASCII для m
).
При выполнении вне структуры аналогичное присваивание приведет к при обнаружении разрушения стека (плюс предупреждения компилятора при использовании gcc -Wformat-overflow
):
char str[4] = "abcd";
printf("%s\n", str);
sprintf(str, "ijklm");
printf("%s\n", str);
abcd
ijklm
*** stack smashing detected ***: terminated
Вопрос: Почему нет разрушения стека (или аналогичного переполнения) обнаружение при назначении слишком длинного массива char для члена структуры?
Обратите внимание, что я не спрашиваю, как исправить пример кода. Это делается путем увеличения размера члена структуры или динамического выделения c (например, Выделение структуры с гибким элементом массива ).