这里只是一个新程序员。
我正在尝试使用
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]|
如果您查看
语句,您可以看到我使用了一个格式说明符,即printf
用于%llu
因为(如果我是对的)它是long long unsigned int
的数据类型。size_t
显然这是不对的。某些 C 实现可能使用
long long unsigned int
来表示 size_t
,但您的实现不会。
C 标准为
printf
类型指定了一个 size_t
格式标志,z
,因此 %zu
是一个正确的转换说明符,可在任何 C 实现中用于 size_t
。
来自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);
^^^^