[英]The result of printing an uint64_t array
我有这么一小段代码:
uint64_t test[] = {1, 2, 3, 4, 5};
printf("test value: %llu\n", test);
我尝试打印test
数组,它给了我这个数字:
test value: 140732916721552
有人可以解释一下 uint64_t 数组的工作原理吗? 谢谢
在你的代码中
uint64_t test[] = {1, 2, 3, 4, 5};
printf("test value: %llu\n", test);
%llu
告诉printf
它应该打印一个long long unsigned
printf
语句的test
部分将指向数组第一个元素的指针传递给printf
。 换句话说,您传递的内容(指针)与您告诉printf
打印的内容(long long unsigned)不匹配。
在 C 中,这种不匹配会导致“未定义的行为”。 所以一般来说,不可能说会打印什么。 从 C 标准的角度来看,任何打印输出都是合法的。 不打印出来也是合法的。 程序崩溃是合法的。 任何……都是合法的。
不可能说一般情况下会发生什么。 在特定系统上,可以深入研究底层事物并弄清楚发生了什么。 在我的系统上,打印值对应于第一个数组元素的地址,该元素被解释为 long long unsigned integer。但不要依赖它。 其他系统可能会做一些完全不同的事情。
下面的代码显示了如何正确打印数组的地址和数组元素。
#include <stdio.h>
#include <inttypes.h>
int main(void)
{
uint64_t test[] = {1, 2, 3, 4, 5};
// Print the address where the array is located
printf("Address of test value is %p\n", (void*)test);
// Print the values of the array elements
size_t sz = sizeof test / sizeof test[0];
for (size_t i = 0; i < sz; ++i)
printf("test[%zu] is %" PRIu64 "\n", i, test[i]);
return 0;
}
Output(注意:每次调用的地址可能不同):
Address of test value is 0x7ffc4ace5730
test[0] is 1
test[1] is 2
test[2] is 3
test[3] is 4
test[4] is 5
当您在 C 中定义这样的数组时,您实际做的是将这些值中的每一个作为单独的uint64_t
按顺序存储在堆栈上。 分配给test
标识符的值是指向这些值中第一个的指针,一个uint64_t*
而不是uint64_t
。 当您打印test
时,您打印的是指针而不是任何元素,即数组中第一个元素的 memory 地址。
[]
表示法等同于
*(test + i)
即它取消引用指向第i
个元素的指针。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.