В некоторых примерах кода, предоставленных профессором:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
char alpha[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
printf( "%s\n", alpha );
printf( "%c\n", alpha[8] );
alpha[8] = 'Z'; /* segmentation fault if alpha is declared statically! */
printf( "%d\n", sizeof( alpha ) );
printf( "%d\n", strlen( alpha ) );
char x[10];
strncpy( x, alpha, 26 );
/* strncpy() will NOT copy or append a '\0' */
printf( "%s\n", x );
return EXIT_SUCCESS;
}
При первой компиляции и запуске программы происходит сбой из-за того, что, как я вижу, в течение нескольких минут работы с Google, механизм защиты gcc от буферапереполнение (вызвано printf( "%s\n", x );
, в котором x был заполнен 26 байтами от альфы).Я верю, что понимаю это.
Однако при отключении механизма защиты с помощью gcc -fno-stack-protector вывод, который я вижу:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
I
27
26
ABCDEFGHZJKLMNOPQRSTUVWXYZKLMNOPQRSTUVWXYZ
Я подумал, что, поскольку strncpy не завершает нуль, завершает строку, этокогда печатается X
, он может фактически напечатать полное значение alpha
- но на самом деле он печатает все alpha
, а затем еще немного alpha
!
Может ли кто-нибудь дать здесь некоторое представление