summaryrefslogtreecommitdiffstats
path: root/man/man3type/void.3type
diff options
context:
space:
mode:
Diffstat (limited to 'man/man3type/void.3type')
-rw-r--r--man/man3type/void.3type76
1 files changed, 76 insertions, 0 deletions
diff --git a/man/man3type/void.3type b/man/man3type/void.3type
new file mode 100644
index 000000000..91d458ff7
--- /dev/null
+++ b/man/man3type/void.3type
@@ -0,0 +1,76 @@
+.\" Copyright (c) 2020-2022 by Alejandro Colomar <alx@kernel.org>
+.\" and Copyright (c) 2020 by Michael Kerrisk <mtk.manpages@gmail.com>
+.\"
+.\" SPDX-License-Identifier: Linux-man-pages-copyleft
+.\"
+.\"
+.TH void 3type (date) "Linux man-pages (unreleased)"
+.SH NAME
+void \- abstract type
+.SH SYNOPSIS
+.nf
+.B void *
+.fi
+.SH DESCRIPTION
+A pointer to any object type may be converted to a pointer to
+.I void
+and back.
+POSIX further requires that any pointer,
+including pointers to functions,
+may be converted to a pointer to
+.I void
+and back.
+.P
+Conversions from and to any other pointer type are done implicitly,
+not requiring casts at all.
+Note that this feature prevents any kind of type checking:
+the programmer should be careful not to convert a
+.I void *
+value to a type incompatible to that of the underlying data,
+because that would result in undefined behavior.
+.P
+This type is useful in function parameters and return value
+to allow passing values of any type.
+The function will typically use some mechanism to know
+the real type of the data being passed via a pointer to
+.IR void .
+.P
+A value of this type can't be dereferenced,
+as it would give a value of type
+.IR void ,
+which is not possible.
+Likewise, pointer arithmetic is not possible with this type.
+However, in GNU C, pointer arithmetic is allowed
+as an extension to the standard;
+this is done by treating the size of a
+.I void
+or of a function as 1.
+A consequence of this is that
+.I sizeof
+is also allowed on
+.I void
+and on function types, and returns 1.
+.SS Use with printf(3) and scanf(3)
+The conversion specifier for
+.I void *
+for the
+.BR printf (3)
+and the
+.BR scanf (3)
+families of functions is
+.BR p .
+.SH VERSIONS
+The POSIX requirement about compatibility between
+.I void *
+and function pointers was added in
+POSIX.1-2008 Technical Corrigendum 1 (2013).
+.SH STANDARDS
+C11, POSIX.1-2008.
+.SH HISTORY
+C89, POSIX.1-2001.
+.SH SEE ALSO
+.BR malloc (3),
+.BR memcmp (3),
+.BR memcpy (3),
+.BR memset (3),
+.BR intptr_t (3type)