В примере кода, предоставленном профессором:
#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
печатается на самом деле может напечатать полное значение альфа
, но на самом деле он печатает всю альфа
, а затем еще несколько альфа
!
Может кто-нибудь предоставить некоторые понимание здесь?