Проблема в том, что вы копируете в строку длиной 1 байт более длинную строку, что приводит к неопределенному поведению.
Если вы запустите эту программу:
#include<stdio.h>
#include<string.h>
int main(int argc, char *argv[])
{
char a[] = "String ABC";
char b[1];
printf("%p\n", &a);
printf("%p\n", &b);
strcpy(b, a);
int i;
printf("%c\n", *(&(a[0])-1));
printf("%c\n", a[0]);
printf("%s\n",a);
printf("%s\n",b);
printf("%p\n", &a);
printf("%p\n", &b);
}
вы увидите b
и a
имеют смежные адреса, а b
сохраняется в адресе памяти до a
.Скорее всего, strcpy
копирует строку в b
, но поскольку b
не выделяется для хранения такой длинной строки, она перезаписывает следующую непрерывную ячейку памяти, которая выглядит как a
.
Позвольте мнеукажите ||
ячейку памяти, в которой хранится символ.Предположим, -b-
- это ячейка, в которой хранится одна строка длиной в символ.Перед копированием у вас есть
|-b-|---a memory allocation--|
|-b-|S|t|r|i|n|g| |A|B|C|D|\n|
Теперь a
копируется в b
: вторая ячейка - это ячейка a
, которая теперь содержит t
|--a memory allocation-|
|S|t|r|i|n|g| |A|B|C|D|\n|
Thisэто то, что я предполагаю, что это происходит.Но помните, что копирование более длинной строки в более короткую приведет к неопределенному поведению.