我使用了一个非常简单的代码:
int main(void)
{
size_t variable;
/*prompt*/
printf("enter the value of the variable: ");
scanf("%zd", variable);
printf("you entered %zd value of the variable", variable);
}
但是,GCC编译器会产生以下结果:
Enter the vale of the size_t variable: 15
You entered zd value of size_t type
Process returned 35 (0X23) execution time: 3.094s
Press any key to continue
我的书也直接演示了上面的例子,但没有提到它是某种特殊的格式说明符,如果要包含库文件的话。甚至the online compiler也没有产生正确的结果。为什么代码不起作用?
scanf("%zd", variable);
是未定义的行为,因为您没有传递指针。
printf("you entered %zd value of the variable");
也是未定义的行为,因为您使用了格式说明符但未传递匹配的参数。
%zd
是C11托管实现的强制功能。这意味着任何实现stdio.h的编译器都必须使用它。然而,%zd
没有多大意义,因为size_t
总是没有签名。请改用%zu
。
请注意,存在标准库的不兼容实现,最明显的是Microsoft的Windows实现。 Visual Studio以及gcc / mingw编译器使用标准库的Microsoft实现。该库不能正确支持%zu
,因为它不符合C11标准。
不,%zd
是实现符合要求的格式说明符之一,它不是可选的。
引用C11
,章节§7.21.6.2,fscanf()
z
指定以下d
,i
,o
,u
,x
,X
或n
转换说明符适用于具有指向size_t
的类型指针或相应的有符号整数类型的参数。
也就是说,在你的代码中,使用是错误的,原因有两个。
size_t
被定义为无符号整数类型,因此您应该使用适当的格式说明符%zu
,而不是%zd
。
再次引用C11
,章节§7.19
size_t
这是sizeof运算符的结果的无符号整数类型;就像是
scanf("%zu", &variable);
应该工作正常。