Проблема, с которой люди часто сталкиваются с XML, заключается в том, что они предполагают, что все элементы доступны. Это не всегда безопасно. Таким образом, это утверждение:
sprintf(infos->firstname, "%s", card->FirstChild("firstname")->FirstChild()->Value());
Это небезопасно, потому что вы на самом деле не знаете, все ли
функции фактически возвращают действительные объекты. Вам действительно нужно что-то
как следующее (который не оптимизирован для скорости, как я не
знать имя структуры tinyXML, возвращаемое в каждой точке и, таким образом,
я не храню результаты один раз, а скорее вызываю каждую функцию
несколько раз:
if (card->FirstChild("firstname") &&
card->FirstChild("firstname")->FirstChild()) {
sprintf(infos->firstname, "%s", card->FirstChild("firstname")->FirstChild()->Value());
}
И затем, для защиты от переполнения буфера из данных, которые вы должны
действительно делать:
if (card->FirstChild("firstname") &&
card->FirstChild("firstname")->FirstChild()) {
infos->firstname[sizeof(infos->firstname)-1] = '\0';
snprintf(infos->firstname, sizeof(infos->firstname)-1, "%s", card->FirstChild("firstname")->FirstChild()->Value());
}
Разве вы не любите обработку ошибок?
Что касается другого вашего вопроса:
Я также видел, что мы можем использовать что-то вроде int * myArray =
calloc (NbOfRows, NbOfRows * sizeof (int)); Почему мы должны объявлять массив
как это.. ? х)
calloc
сначала инициализирует полученную память 0, в отличие от malloc.
Если вы видите выше, где я установил конец буфера в '\ 0' (что
на самом деле 0), потому что malloc возвращает буфер с потенциально
случайные (ненулевые) данные в нем. calloc сначала установит весь буфер
сначала на все 0, что в целом может быть безопаснее.