We should use “%zu” to print the variables of size_t length. We can use “%d” also to print size_t variables, it will not show any error. The correct way to print size_t variables is use of “%zu”. In “%zu” format, z is a length modifier and u stand for unsigned type.
size_t is an unsigned integral data type which is defined in various header files such as: <stddef.h>, <stdio.h>, <stdlib.h>, <string.h>, < time .h>, <wchar.h> It's a type which is used to represent the size of objects in bytes and is therefore used as the return type by the sizeof operator.
I am using the mingw-w64 (x64) fork of minGW as prepared on nuwen.net. This is from the 7.1 version of gcc :
gcc --version gcc (GCC) 7.1.0
I am compiling this program:
#include <stdio.h> int main(void) { size_t a = 100; printf("a=%lu\n",a); printf("a=%llu\n",a); printf("a=%zu\n",a); printf("a=%I64u\n",a); }
with warnings and c11 standard:
gcc -Wall -Wextra -Wpedantic -std=c11 test_size_t.c
and I get these warnings:
test_size_t.c: In function 'main': test_size_t.c:6:14: warning: format '%lu' expects argument of type 'long unsigned int', but argument 2 has type 'size_t {aka long long unsigned int}' [-Wformat=] printf("a=%lu\n",a); ~~^ %I64u test_size_t.c:6:14: warning: format '%lu' expects argument of type 'long unsigned int', but argument 2 has type 'size_t {aka long long unsigned int}' [-Wformat=] printf("a=%lu\n",a); ~~^ %I64u test_size_t.c:7:14: warning: unknown conversion type character 'l' in format [-Wformat=] printf("a=%llu\n",a); ^ test_size_t.c:7:9: warning: too many arguments for format [-Wformat-extra-args] printf("a=%llu\n",a); ^~~~~~~~~~ test_size_t.c:7:14: warning: unknown conversion type character 'l' in format [-Wformat=] printf("a=%llu\n",a); ^ test_size_t.c:7:9: warning: too many arguments for format [-Wformat-extra-args] printf("a=%llu\n",a); ^~~~~~~~~~ test_size_t.c:8:13: warning: unknown conversion type character 'z' in format [-Wformat=] printf("a=%zu\n",a); ^ test_size_t.c:8:9: warning: too many arguments for format [-Wformat-extra-args] printf("a=%zu\n",a); ^~~~~~~~~ test_size_t.c:8:13: warning: unknown conversion type character 'z' in format [-Wformat=] printf("a=%zu\n",a); ^ test_size_t.c:8:9: warning: too many arguments for format [-Wformat-extra-args] printf("a=%zu\n",a); ^~~~~~~~~ test_size_t.c:9:9: warning: ISO C does not support the 'I64' ms_printf length modifier [-Wformat=] printf("a=%I64u\n",a); ^~~~~~~~~~~ test_size_t.c:9:9: warning: ISO C does not support the 'I64' ms_printf length modifier [-Wformat=]
I would like to printf a size_t without warning but don't know the correct format specifier in this situation.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With