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 に答える