Почему приведенный ниже код 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