Почему это намеренно неправильное использование strcpy не приводит к ужасным сбоям?

Почему приведенный ниже код C, использующий strcpy , мне подходит? Я пытался заставить его выйти из строя двумя способами:

1) Я пробовал strcpy из строкового литерала в выделенную память, которая была слишком мала для его хранения. Он все скопировал и не жаловался.

2) Я попробовал strcpy из массива, который не был NUL -терминирован. strcpy и printf работали нормально. Я думал, что strcpy копирует char до тех пор, пока не будет найден NUL , но его не было, и он все равно остановился.

Почему они не терпят неудачу. ? Мне просто в каком-то смысле "повезло",или я неправильно понимаю, как работает эта функция? Это специфично для моей платформы (OS X Lion) или большинство современных платформ работают именно так?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    char *src1 = "123456789";
    char *dst1 = (char *)malloc( 5 );

    char src2[5] = {'h','e','l','l','o'};
    char *dst2 = (char *)malloc( 6 );

    printf("src1: %s\n", src1);
    strcpy(dst1, src1);
    printf("dst1: %s\n", dst1);
    strcpy(dst2, src2);
    printf("src2: %s\n", src2);
    dst2[5] = '\0';
    printf("dst2: %s\n", dst2);

    return 0;
}

Результат выполнения этого кода:

$ ./a.out   
src1: 123456789
dst1: 123456789
src2: hello 
dst2: hello
11
задан Gabe Durazo 21 August 2011 в 17:29
поделиться