C: strncpy больше символов, чем выделено, затем печатает… неожиданный вывод?

В примере кода, предоставленном профессором:

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

Может кто-нибудь предоставить некоторые понимание здесь?

0
задан Joseph 8 March 2012 в 05:49
поделиться