我在使用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;
答案 0 :(得分:2)
这是你的问题:
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*
。
编辑:正如Keith在评论中提到的,当使用C( not C ++)时,将malloc
的结果强制转换可能会被视为不好。 This question讨论了该主题。