что происходит с strcat и статически размещенными символьными массивами? - PullRequest
2 голосов
/ 21 октября 2011

Я нашел это в каком-то устаревшем коде.

static char title1[] = "SUMMARY REPORT";
static char title2[] = "PERIOD: ";

...

strcat(title2, "10/10/2011");

Эта операция strcat приводит к перезаписи title1 частью строки даты. Я смог воспроизвести это в небольшой программе, но не со статическими массивами. Я посмотрел на область памяти в унаследованном коде, и буфер title2 расположен непосредственно перед title1. Исправление было простым, я просто добавил к title2 длину (которая толкала начало title1 дальше в памяти), чтобы она содержала всю дату. Почему title2 позади title1 в памяти? Это на SPARC, кстати.

Ответы [ 2 ]

3 голосов
/ 21 октября 2011

Почему title2 стоит за title1 в памяти?

Почему бы и нет?Стандарт не дает никаких гарантий относительно того, где будут находиться объекты.Код, который вы показываете, в корне неверен.strcat Место назначения должно содержать строку C и быть достаточно большим, чтобы содержать объединенную результирующую строку.

0 голосов
/ 21 октября 2011

strcat предполагает, что буфер, который вы передаете, достаточно велик для хранения объединенной строки, и он будет перезаписан поверх конца вашего буфера, если он слишком мал.Поэтому все, что стоит за вашим буфером, перезаписывается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...