функция opendir портит имя каталога - PullRequest
0 голосов
/ 07 декабря 2011

У меня проблема с функцией opendir в C. Вот код:

Объявление rvm:

rvm_t func()
{
   rvmBlock=(rvm_t)malloc(sizeof(rvm_t));
   return rvmBlock;
}

rvm_t rvm;
rvm=func();

printf("rvm->backingStore=%s\n", rvm->backingStore); 
if( (dir = opendir(rvm->backingStore)) !=NULL )
{
   printf("rvm->backingStore inside if=%s\n", rvm->backingStore);
}

Вывод, который я получаю для этогоis:

rvm->backingStore=rvm_segments/
rvm->backingStore inside if=rvm_segments!? 

"!?" - некоторые символы мусора, которые появляются по некоторым причинам.

Может кто-нибудь объяснить, что происходит не так.

Вот структура rvm:

struct rvm_info
{

   char backingStore[20];
   struct memSeg * memSegs[20];
   long int storage_size;
   int memSeg_count;
   FILE * log_fd;
};

typedef struct rvm_info* rvm_t;

1 Ответ

2 голосов
/ 07 декабря 2011

Это ваша проблема:

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. В этом вопросе есть обсуждение по теме.

...