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=%sn", rvm->backingStore); 
if( (dir = opendir(rvm->backingStore)) !=NULL )
{
   printf("rvm->backingStore inside if=%sn", 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;

这就是你的问题:

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*时。

EDIT:正如Keith在评论中提到的,当使用C (而不是 c++)时,可以认为转换malloc的结果是不好的。

相关内容

  • 没有找到相关文章

最新更新