为什么这个打印声明搞砸了?

时间:2012-11-18 07:49:52

标签: c dirent.h

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上打印名称,并且它正常工作。所以问题出在转移和重新分配/铸造的某个地方。

1 个答案:

答案 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));