繁体   English   中英

打印 uint64_t 数组的结果

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM