Без нулевого символа во втором аргументе для функции strcpy () возвращается неожиданный результат.Зачем? - PullRequest
0 голосов
/ 25 октября 2018
#include<stdio.h>
#include <string.h>
int main()
{
    char a[5];
    char b[2]="12";
    strcpy(a,b);
    printf("%s\n",a);
}

В строке b нет нулевого символа, поэтому вывод не такой, как ожидалось.
вывод: 12 @
Почему вывод поступает только так?

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Ваша программа имеет неопределенное поведение.

Ваш массив b содержит { '1', '2' }.Как вы говорите, в массиве нет нулевого символа - это означает, что он не содержит строку.

strcpy Второй аргумент должен быть указателем на строку,Вы дали ему значение char*, которое не является указателем на строку.

На практике strcpy, вероятно, продолжит копирование символов из памяти после b.Эта память содержит произвольный мусор - и даже попытка доступа к нему имеет неопределенное поведение.

В некотором смысле вам повезло, что вы получили вывод, который является явно мусором.Если в памяти сразу за вашим массивом был нулевой символ, и если ваша программа не взорвалась, пытаясь получить к нему доступ, она могла бы просто напечатать 12, и вы могли не знать, что ваша программа содержит ошибки.

Если вы хотите исправить свою программу, вы можете изменить

char b[2] = "12";

на

char b[] = "12";

Компилятор определит, насколько большим должен быть bдля хранения строки (включая требуемый завершающий нулевой символ).

0 голосов
/ 25 октября 2018

strcpy продолжает копировать, пока не достигнет нулевого символа (байт со значением 0x00).Он копирует все, что встречается на пути.В вашем случае память после массива b содержит байт со значением 0x40 ('@') и затем байт со значением 0x00.

...