【问题标题】:opendir function corrupts directory nameopendir 函数损坏目录名称
【发布时间】:2011-12-07 03:04:16
【问题描述】:

我在使用 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;

【问题讨论】:

  • 显示rvm的声明,它可能指向一个无效的位置。我希望你不要在没有为其分配内存的情况下执行rvm_t rvm;,因为rvm_t 的类型是rvm_info*
  • 这不是rvm 的声明,告诉我们你在哪里有类似的东西:rvm_t rvm ...
  • @AusCBloke 我刚刚添加了它

标签: c opendir


【解决方案1】:

这是你的问题:

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 在 cmets 中提到的,当使用 C(不是 C++)时,转换 malloc 的结果可能被认为是不好的。 This question 已经讨论过这个话题。

【讨论】:

  • 不要投射调用malloc()的结果。
  • @KeithThompson:这不是故意的,我复制并粘贴了他的代码以显示主要错误,但无论如何我都会对其进行编辑,因为这纯粹是 C 语言,这不是一个好习惯。
猜你喜欢
  • 2016-03-18
  • 1970-01-01
  • 1970-01-01
  • 2015-06-08
  • 2016-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多