%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
2条答案
按热度按时间bxjv4tth1#
在你的代码中
%llu
告诉printf
应打印long long unsigned
整数。printf
语句的test
部分将指向数组第一个元素的指针传递给printf
。换句话说,您传递的内容(指针)与您告诉printf
打印的内容(long long unsigned)不匹配。在C语言中,这样的不匹配会导致“未定义的行为”。所以一般来说,不可能说什么会被打印出来。从C标准的Angular 来看,任何打印出来的东西都是法律的的。没有打印出来的东西也是合法的。程序崩溃是合法的。任何东西......都是合法的。
一般来说,不可能说清楚发生了什么。在一个特定的系统上,可以深入到底层的东西,并找出发生了什么。在我的系统上,打印的值对应于第一个数组元素的地址,该元素被解释为long long unsigned integer。但不要依赖于此。其他系统可能会做完全不同的事情。
下面的代码显示如何正确打印数组和数组元素的地址。
输出(注:地址在每次调用中可能不同):
js5cn81o2#
当你用C语言定义一个这样的数组时,你实际上是在堆栈中将这些值按顺序存储为单独的
uint64_t
。分配给test
标识符的值是指向这些值中第一个值的指针,是uint64_t*
而不是uint64_t
。当你打印test
时,你打印的是指针而不是任何元素。即数组中第一个元素的内存地址。[]
表示法等效于即它解引用指向第
i
个元素的指针。