Эта строка
memcpy(&directoryEntries[entryCount], directoryEntry, sizeof(struct dirent));
должна быть вместо этого:
memcpy(&(*directoryEntries)[entryCount], directoryEntry, sizeof(struct dirent));
или эквивалентно:
memcpy(*directoryEntries + entryCount, directoryEntry, sizeof(struct dirent));
Причина в том, что directoryEntries
является указателем на указатель на массив.В памяти это выглядит так:
+------------+
directoryEntries --> array_head --> | dirents[0] |
+------------+
| dirents[1] |
+------------+
| dirents[2] |
+------------+
| ... |
Но вы рассматриваете это как directoryEntries
- указатель на массив, который не является:
WRONG! +------------+
directoryEntries --> | dirents[0] |
+------------+
| dirents[1] |
+------------+
| ... |
Так что выВы записываете за пределы памяти, которой вы не владеете, что приводит к неопределенному поведению.
Причина, по которой вам необходим дополнительный уровень косвенности, заключается в том, что в C параметры функции всегда передаются по значению.Чтобы изменить параметр, вам нужно передать указатель на исходное значение, что вы и делаете.Вам просто нужно помнить, что при работе с этим указателем у вас есть дополнительный уровень косвенности.
Если вы используете C ++, а не C, вам было бы гораздо лучше использовать ссылочный параметр вместо указателя, и вы также должны использовать std::vector<struct dirent>
.Вам не нужно беспокоиться о дополнительном уровне косвенности, и управление памятью обрабатывается автоматически.