d_name); 给了我未定义的行为。我只是在输出中得到奇怪的符号,有时后面跟着随机字母。 ent 是一个 dirent 结构。 它是在传递给 p-6ren">
gpt4 book ai didi

c - 为什么这个 print 语句会出错?

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

printf("%s\n", (char*)ent->d_name); 给了我未定义的行为。我只是在输出中得到奇怪的符号,有时后面跟着随机字母。 ent 是一个 dirent 结构。

它是在传递给 pthread 的函数内声明的。

void * copyFile( void * arg ){

struct dirent *ent = (struct dirent *)arg;

printf("%s\n", (char*)ent->d_name);

}

并这样调用:

int ret = pthread_create(&thread_list[i], NULL, copyFile, &ent);

我尝试在调用函数中打印原始ent上的名称,并且它工作正常。所以问题出在转移和重新分配/选角的某个地方。

最佳答案

readdir 函数使用静态内存来填充 dirent 结构。也就是说,对 readdir 的后续调用可能会覆盖同一区域,并且稍后引用该内存片段会导致未定义的行为。

您需要在 readdir 调用之后立即复制该结构,并将此副本传递给线程,而不是原始结构:

struct dirent *dp = readdir(dirp);
struct dirent *dp_on_the_heap = malloc(sizeof(struct dirent));
memcpy(dp_on_the_heap, dp, sizeof(struct dirent));

关于c - 为什么这个 print 语句会出错?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13438420/

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