只是个新来的程序员。
我正在试验size_t
和sizeof
,特别是用它们来确定数组的大小,因为我试图使索引数可变的数组。
代码:
int main() {
int index = 0;
printf("Enter size of an array: ");
scanf("%d", &index);
int MyArray[index];
size_t capacity = sizeof(MyArray)/sizeof(MyArray[0]);
printf("\nThe length of your array is: %llu", capacity);
return 0;
}
如果您查看printf
语句,您可以看到我使用了格式说明符%llu
来表示long long unsigned int
,因为(如果我是对的)它是size_t
的数据类型。
但它会给我多个警告,比如:
warning: unknown conversion type character 'l' in format [-Wformat=]|
warning: too many arguments for format [-Wformat-extra-args]|
2条答案
按热度按时间mccptt671#
如果您查看
printf
语句,您可以看到我使用了格式说明符%llu
来表示long long unsigned int
,因为(如果我是对的)它是size_t
的数据类型。显然这是不对的。一些C实现可能使用
long long unsigned int
来表示size_t
,但您的实现没有。C标准为
size_t
类型z
指定了printf
标志,因此%zu
是在任何C实现中用于size_t
的正确转换说明符。ilmyapht2#
对于所获得的警告,则此转换说明符
%llu
按原样正确写入。这些警告可能是某些其他消息的结果,即使用了具有size_t
类型值的不正确转换说明符。还有一些非常老的编译器不支持类型
long long int
和unsigned long long int
,因此没有引入转换说明符llu
。但是,在任何情况下,您使用的转换说明符都是无效的,其值的类型为
size_t
。来自C标准(7.19通用定义)<stddef.h>)
4用于size_t和ptrdiff_t的类型的整数转换等级不应大于有符号long int的整数转换等级,除非实现支持足够大的对象,使其成为必要。
通常类型
size_t
被定义为类型unsigned long int
的别名。类型unsigned long long int
的秩大于类型unsigned long int
的秩(与类型signed long int
的秩相同)。例如,在Microsoft C中,
sizeof( unsigned long long int )
等于8
,而sizeof( unsigned long int )
和sizeof( size_t )
等于4
,并且类型size_t
被定义为类型unsigned int
的别名,而不是通常使用的类型unsigned long
。和C标准(7.21.6.1 fprintf函数)中的函数
7长度修饰符及其含义为:
因此,要输出
size_t
类型的对象,应该使用转换说明符zu
。还有
9如果转换规范无效,则行为为未定义。如果任何参数不是对应转换规范的正确类型,则行为为未定义。
所以你应该这样写