The Pointer The Pointer - 9 months ago 52
C Question

Structure declaration and definition

I'm confused as to the difference between a structure declaration and a structure definition. At what point does one become the other?

For illustration, let's use the stat structure

struct stat {
dev_t st_dev; /* ID of device containing file */
ino_t st_ino; /* inode number */
mode_t st_mode; /* file type and mode */
nlink_t st_nlink; /* number of hard links */
uid_t st_uid; /* user ID of owner */
gid_t st_gid; /* group ID of owner */
dev_t st_rdev; /* device ID (if special file) */
off_t st_size; /* total size, in bytes */
blksize_t st_blksize; /* blocksize for filesystem I/O */
blkcnt_t st_blocks; /* number of 512B blocks allocated */

/* Since Linux 2.6, the kernel supports nanosecond
precision for the following timestamp fields.
For the details before Linux 2.6, see NOTES. */

struct timespec st_atim; /* time of last access */
struct timespec st_mtim; /* time of last modification */
struct timespec st_ctim; /* time of last status change */

#define st_atime st_atim.tv_sec /* Backward compatibility */
#define st_mtime st_mtim.tv_sec
#define st_ctime st_ctim.tv_sec

In my mind this structure has already been declared. However, it has not been defined, since memory has not been allocated for its fields.

Now, what happens when I do the following?

struct stat buf;

I have declared buf to be a structure of type
struct stat
, right? But did this also act as a definition? In other words, was memory allocated to the fields of

I would appreciate it if someone could clearly clarify the difference between a structure declaration and definition, and at what point one turns into the other.

Thank you.

Answer Source

In your first example, that is a declaration as well as a definition for the structure, but you have neither declared nor defined any variables of that structure's type.

The following line is a definition as well as a declaration.

struct stat buf;

If you wanted to make a declaration without allocating storage, as you would do in a shared header file, you would use the extern keyword to declare.

extern struct stat buf;