C语言 打印uint64_t数组的结果

qybjjes1  于 2023-01-12  发布在  其他
关注(0)|答案(2)|浏览(1212)

我有一小段代码:

uint64_t test[] = {1, 2, 3, 4, 5};
printf("test value: %llu\n", test);

我试着打印test数组,它给出了这个数字:

test value: 140732916721552

有人能解释一下这一点以及uint64_t数组是如何工作的吗?谢谢

bxjv4tth

bxjv4tth1#

在你的代码中

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标准的Angular 来看,任何打印出来的东西都是法律的的。没有打印出来的东西也是合法的。程序崩溃是合法的。任何东西......都是合法的。
一般来说,不可能说清楚发生了什么。在一个特定的系统上,可以深入到底层的东西,并找出发生了什么。在我的系统上,打印的值对应于第一个数组元素的地址,该元素被解释为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;
}

输出(注:地址在每次调用中可能不同):

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
js5cn81o

js5cn81o2#

当你用C语言定义一个这样的数组时,你实际上是在堆栈中将这些值按顺序存储为单独的uint64_t。分配给test标识符的值是指向这些值中第一个值的指针,是uint64_t*而不是uint64_t。当你打印test时,你打印的是指针而不是任何元素。即数组中第一个元素的内存地址。
[]表示法等效于

*(test + i)

即它解引用指向第i个元素的指针。

相关问题