Это ваша проблема:
rvm_t func()
{
rvmBlock=(rvm_t)malloc(sizeof(rvm_t));
return rvmBlock;
}
rvm_t
определяется как указатель на struct rvm_info
, поэтому вы передаете неправильный размер malloc
. sizeof(rvm_t)
соответствует размеру указателя (обычно 4 или 8 байт), а НЕ размеру struct rvm_info
(который превышает 4 или 8 байт). Вы хотите, чтобы размер был struct rvm_info
, а НЕ указатель. Измените этот вызов на:
rvmBlock = malloc( sizeof(*rvmBlock) );
Что просто означает:
rvmBlock = malloc( sizeof(struct rvm_info) );
В противном случае вы вызываете неопределенное поведение, поскольку вы не выделили достаточно памяти для целого struct rvm_info
. Поэтому вы будете хранить эту строку в той части памяти, которая не была выделена для rvm
, и любая другая часть программы могла бы выделить эту память.
Просто так получается, что вызов opendir
вызывает изменение некоторой памяти в куче, он не / непосредственно не изменяет передаваемую ему строку, тем более что аргумент имеет тип const char*
.
РЕДАКТИРОВАТЬ: Как упомянул Кит в комментариях, при использовании C ( не C ++) можно считать плохим приводить результат malloc
. В этом вопросе есть обсуждение по теме.