0

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我尝试在调用函数中在原件上打印名称,它工作正常。所以问题出在转移和重新分配/铸造的某个地方。

4

1 回答 1

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));
于 2012-11-18T08:02:48.420 回答