Когда вы инициализируете массив и опускаете размерность, компилятор выводит размерность из числа инициализаторов.
Итак, этот оператор:
char a[] = {'H','e','y','a','\0'};
эквивалентно этому:
char a[5] = {'H','e','y','a','\0'};
strcat()
добавляет копию исходной строки к строке назначения. Он не проверяет, достаточно ли большой буфер назначения, чтобы содержать конкатенированную результирующую строку или нет. Если место назначения недостаточно велико для хранения объединенной результирующей строки, это приводит к неопределенному поведению, которое включает в себя то, что он может выполняться неправильно (либо сбой, либо молча генерируя неправильные результаты), или он может делать именно то, что задумал программист.
Вы должны указать размер буфера a
, достаточный для хранения объединенной результирующей строки. В вашей программе размер исходной строки bro!
равен 4
. strcat()
заменяет целевой символ null
первым символом исходной строки при их объединении, а нулевой символ включается в конец сформированной новой строки. Итак, в вашем случае минимальный размер, необходимый для хранения объединенной результирующей строки, равен 9
.
Объявите a
как:
char a[9] = {'H','e','y','a','\0'};
должно работать нормально.
Как предложил Дэвид (в комментариях) вместо 9
вы можете взять разумный размер буфера, например 512
или 1024
(например, a[512]
или a[1024]
). Это поможет вам избежать проблем до некоторой степени. Однако вам нужно позаботиться о проблемах переполнения буфера в вашем коде. Например, вы можете использовать strncat(), что дает вам возможность указать максимальное размер, который вы можете добавить в строку назначения.
Вы можете указать максимальное количество символов, которые будут добавлены как -
(size of destination buffer) - (the length of the destination string) - 1
чтобы избежать переполнения буфера.
person
H.S.
schedule
16.02.2018
.o
; обычно используется для объектных файлов, а не полных программ. Ваш исходный код не компилируется корректно по правилам C99 или C11. Ваш вызовstrcat()
вызывает неопределенное поведение; вы пишете за конец вашего массива. С UB разрешено все — сбои, видимость работы, переформатирование жесткого диска. - person Jonathan Leffler   schedule 16.02.2018char a[]
и, к несчастью, получили желаемый результат с первого раза. Сделайтеa
достаточно большим, чтобы поместиться в объединенный массив строк. - person Justin Randall   schedule 16.02.2018string.h
, компилятор вызоветstrcat
. Но если вы включите заголовок, может случиться так, что в данном случае испускаемый вызов является чем-то другим, а не vanillastrcat
. На моей машине он вызывает__strcat_chk
, которые ведут себя иначе и вызывают прерывание. - person Jean-Baptiste Yunès   schedule 16.02.2018