gpt4 book ai didi

c - opendir 函数损坏目录名称

转载 作者:行者123 更新时间:2023-11-30 14:26:54 25 4
gpt4 key购买 nike

我在使用 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_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(不是 C++)时,转换 malloc 的结果可能被认为是不好的>。 This question就该主题进行了讨论。

关于c - opendir 函数损坏目录名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8409899/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com