gpt4 book ai didi

c - 为什么在声明指针的时候不能打印已经初始化的指针值呢?

转载 作者:太空宇宙 更新时间:2023-11-04 00:14:54 24 4
gpt4 key购买 nike

我用一个常量初始化了指针,我知道它的地址会被传递给指针。所以当我试图测试常量是否可以打印时,程序崩溃了。这是违法的吗?

#include <stdio.h>

int main()
{
int *i = (int *)1;

printf("The value that i pointer points to is %d\n", *i);

return 0;
}

最佳答案

您似乎认为 (int *)1 生成存储值 1 的地址。它没有。

当使用(int *)这样的强制转换将整数转换为指针时,结果通常是将值转换为地址。1

因此 int *i = (int *)1;i 设置为指向地址 1。然后,当尝试打印 *i,你的程序崩溃了,因为 1 不是一个有效的内存地址。 (很常见的是,内存的第一页保持未映射状态,因此对空指针的不正确使用会导致崩溃并揭示问题,而不是让程序继续使用不正确的数据执行。)

要将 i 设置为指向值为 1 的 int,您必须将其设置为具有以下值的 int 对象的地址值 1。一种方法是:

int n = 1;
int *i = &n;

您还可以使用复合文字创建一个值为 1 的未命名 int:

int *i = & (int) { 1 };

(int) { 1 } 创建一个值为 1 的复合文字,& 获取它的地址,然后 i被初始化为该地址。

脚注

1 根据 C 标准,结果是实现定义的。所以编译器可以定义它想要的任何结果。但是,我见过的每个 C 编译器都以某种方式将整数值转换为地址。生成的地址不一定有效用于访问对象。

关于c - 为什么在声明指针的时候不能打印已经初始化的指针值呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56059253/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com