C语言 处理格式说明符%llu时出现警告

fcipmucu  于 2023-03-07  发布在  其他
关注(0)|答案(2)|浏览(508)

只是个新来的程序员。
我正在试验size_tsizeof,特别是用它们来确定数组的大小,因为我试图使索引数可变的数组。
代码:

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]|
mccptt67

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的正确转换说明符。

ilmyapht

ilmyapht2#

对于所获得的警告,则此转换说明符%llu按原样正确写入。这些警告可能是某些其他消息的结果,即使用了具有size_t类型值的不正确转换说明符。
还有一些非常老的编译器不支持类型long long intunsigned 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长度修饰符及其含义为:

    • z****指定后面的d、i、o、u、x或X转换说明符应用于size_t**或相应的有符号整数类型参数;或者后面的n转换说明符应用于指向对应于size_t参数的有符号整数类型的指针。

因此,要输出size_t类型的对象,应该使用转换说明符zu
还有
9如果转换规范无效,则行为为未定义。如果任何参数不是对应转换规范的正确类型,则行为为未定义。
所以你应该这样写

printf("\nThe length of your array is: %zu", capacity);
                                       ^^^^

相关问题