opendir函数破坏目录名称

时间:2011-12-07 03:04:17

标签: c opendir

我在使用C中的opendir函数时出现问题。以下是代码:

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);
}

我得到的输出是:

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 个答案:

答案 0 :(得分:2)

这是你的问题:

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

rvm_t被定义为指向struct rvm_info的指针,因此您将不正确的大小传递给mallocsizeof(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*

编辑:正如Keith在评论中提到的,当使用C( not C ++)时,将malloc的结果强制转换可能会被视为不好。 This question讨论了该主题。