我在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
的结果是不好的。