处理格式说明符 %llu 时的警告

问题描述 投票:0回答:2

这里只是一个新程序员。

我正在尝试使用

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]|
c compiler-warnings sizeof format-specifiers size-t
2个回答
1
投票

如果您查看

printf
语句,您可以看到我使用了一个格式说明符,即
%llu
用于
long long unsigned int
因为(如果我是对的)它是
size_t
的数据类型。

显然这是不对的。某些 C 实现可能使用

long long unsigned int
来表示
size_t
,但您的实现不会。

C 标准为

printf
类型指定了一个
size_t
格式标志,
z
,因此
%zu
是一个正确的转换说明符,可在任何 C 实现中用于
size_t


0
投票

来自C标准(7.19通用定义

4 用于 size_t 和 ptrdiff_t 的类型不应该是整数 转换等级大于 signed long int 的转换等级,除非 实现支持足够大的对象以使其成为必需的。

通常类型

size_t
被定义为类型
unsigned long int
的别名。类型
unsigned long long int
的等级大于类型
unsigned long int
的等级(即与类型
signed long int
的等级相同)。

来自 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);
                                       ^^^^ 
© www.soinside.com 2019 - 2024. All rights reserved.