printf("%s\n", (char*)ent->d_name);
给了我未定义的行为。我只是在输出中得到奇怪的符号,有时后跟随机字母。 ent
是一个直接的结构。
它被声明在一个传递给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
上打印名称,并且它正常工作。所以问题出在转移和重新分配/铸造的某个地方。
答案 0 :(得分:1)
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));