На первый взгляд, код:
int nMalloc = sizeof(dev_t) + sizeof(ino_t) + sizeof(mode_t)+ ...
делает то же самое, что и
int nMalloc = sizeof(struct stat);
Редактировать: ВНИМАНИЕ - caf указала, что
int nMalloc = sizeof(dev_t) + sizeof(ino_t) + ...
- это , а не , обязательно совпадающее с int nMalloc = sizeof(struct stat);
Поля в struct stat
могут иметь ограничения на выравнивание, которые приводят к появлению «дырок» или заполнению между полями.Также могут быть недокументированные поля.Так что struct stat может быть больше, чем сумма опубликованных полей.
Это было бы несложно проверить.
if (nMalloc != sizeof(struct stat)) { fprintf(stderr, "...\n");
, но может измениться в будущем, поэтому ваш оригинал будет более надежным.
На основании предложения caf, это также не обязательно совпадает:
unsigned long base = 0;
memcpy(pathForStatBuff + base,&buf.st_dev,sizeof(dev_t));
base = base + sizeof(dev_t);
...
memcpy(pathForStatBuff + base,&buf.st_ctime,sizeof(time_t));
base = base + sizeof(time_t);
с: memcpy(pathForStatBuff, &buf, sizeof(struct stat));
, но проверка размера обнаружит это.
Таким образом, присвоение полей новой структуре позволит вам получить контроль над необходимыми полями, их порядком и некоторыми аспектами компоновки (тот же компилятор / та же платформа).
Если предпочтительнее memcpy, посмотрите на mempcpy .Это похоже на memcpy, но возвращает указатель на байт после последнего, поэтому вам не нужно делать:
p = memcpy(pathForStatBuf + base, ...
base = base + sizeof(...)
...
base = base + sizeof(...)
p = memcpy(pathForStatBuf + base, ...
base = base + sizeof(...)
, но вместо этого иметь дополнительный указатель и делать
p = memcpy(p, ...
p = memcpy(p, ...
Хотите получить форму для печати?Если это так, вам нужно использовать sprintf, printf или fprintf.По мере того, как вы учитесь, я конвертирую все memcpy в printf("..., buf....field ...);
и сразу же их вижу, это будет проще, чем правильно получить строку в первый раз.