使用 %p 计算 printf 中的表达式

问题描述 投票:0回答:1

我正在研究 C 中的指针。尝试了很多事情来确保我理解指针是如何工作的,但我发现了一些我不理解的东西。这是有问题的代码片段:

int b = 30;
printf("(void *)(size_t)b: %p\n", (void *)(size_t)b);

输出:

(void *)(size_t)b: 0x1e

这就是值 30,以十六进制形式存储在“b”处。我已将表达式放入其中,这样我就知道控制台中的哪个是哪个。

我正在使用 GCC 13.2.1-6 和标志编译代码

-Wall -Werror -Wextra -std=c17 -pedantic-errors
在 x86-64 Linux 机器上。我不知道它是否相关(我是初学者),但是
int
对我来说有 4 个字节。

代码编译良好,没有错误。我不明白为什么它会给出这样的输出。

c pointers printf void-pointers size-t
1个回答
0
投票
int b = 30;

您现在的

int
值为 30 (0x1e)。

(size_t)b

您告诉编译器将其视为

size_t
值 30 (0x1e)。

(void *)(size_t)b

您告诉编译器将这个

size_t
值 30 (0x1e) 视为
void *

printf("%p", (void *)(size_t)b);

打印指针的值,即 30 (0x1e)。请注意,

%p
打印指针,而不是指针指向

并且您不能取消引用该指针(通过在

(void *)(size_t)b
前面添加星号),因为您的指针不是有效,即它实际上并不指向某物,因此取消引用它将是未定义的行为(即不好)。

© www.soinside.com 2019 - 2024. All rights reserved.