man readdir literally says:
If successful, readdir()returns a pointer to the dirent structure. (This structure can be statically distributed, do not try free(3)it.)
(Added code formatting.)
, , , static: itsself, , undefined .
, :
struct dirent *readdir(DIR *dirp) {
static struct dirent dir;
return &dir;
}
dir . , .
readdir glibc 2.22 ( /sysdeps/posix/readdir.c):
DIRENT_TYPE *
__READDIR (DIR *dirp)
{
DIRENT_TYPE *dp;
int saved_errno = errno;
__libc_lock_lock (dirp->lock);
do
{
size_t reclen;
if (dirp->offset >= dirp->size)
{
size_t maxread;
ssize_t bytes;
maxread = sizeof *dp;
maxread = dirp->allocation;
bytes = __GETDENTS (dirp->fd, dirp->data, maxread);
if (bytes <= 0)
{
if (bytes < 0 && errno == ENOENT)
bytes = 0;
if (bytes == 0)
__set_errno (saved_errno);
dp = NULL;
break;
}
dirp->size = (size_t) bytes;
dirp->offset = 0;
}
dp = (DIRENT_TYPE *) &dirp->data[dirp->offset];
reclen = dp->d_reclen;
assert (sizeof dp->d_name > 1);
reclen = sizeof *dp;
dp->d_name[sizeof dp->d_name] = '\0';
dirp->offset += reclen;
dirp->filepos = dp->d_off;
dirp->filepos += reclen;
} while (dp->d_ino == 0);
__libc_lock_unlock (dirp->lock);
return dp;
}
glibc,
dp = (DIRENT_TYPE *) &dirp->data[dirp->offset];
. dirp->data - static , .
, readdir_r readdir .
, readdir. dir, readdir, , / .