/*Suppose we initiate a pointer;*/
int *y;
y=36;
/*Is this allowed in C??*/
/* If it is, what will happen if we write to this;*/
*y= 100;
/*And if its not, then why ?*/
另外请解释这在内存分配中是如何工作的。
答案 0 :(得分:2)
你无法为C中的指针对象分配一个整数值。
有一种特殊情况,您可以出现这样做。常量0
(或更一般地,值为零的整数常量表达式)是空指针常量。但即使在这种情况下,该值也会隐式转换为适当类型的空指针,并且它将存储在{{1}中的空指针值,而不是整数值0
。 }。
y
分配是约束违规。这意味着任何符合标准的编译器必须为包含它的程序发出诊断消息。基本上它意味着赋值是非法的(尽管C标准并没有这样称呼它)。它和
一样有意义int *y;
y = 36;
在非常旧的C版本中,在语言标准化之前,通常允许为指针分配任意整数值。因此,许多编译器将允许这样的分配,并且只打印警告而不是致命的错误消息。这里的教训不是它不是一个严重的错误。经验教训是,应该假设编译器警告(至少其中一些)与致命错误消息一样严重。
现在可以做的是使用强制转换显式将整数值转换为指针类型:
double x = "hello, world";
正如标准所说,这种转换的结果
是实现定义的,可能没有正确对齐,可能没有 指向引用类型的实体,可能是陷阱 表示。
如果您尝试读取或写入y = (int*)36;
指示的对象,则您的程序行为未定义。 如果您很幸运,它将崩溃并显示错误消息。如果你运气不好,它可能会表现得正确"。
在极不可能的情况下,您碰巧知道您可以在机器地址*y
访问int
个对象(更有可能表示为36
),这将是访问它的方式。
除非您在嵌入式系统上进行非常低级别的编程,否则几乎可以肯定该地址上没有此类可访问的0x24
对象。
底线:不要这样做。如果你的编译器让你逃脱它,它真的没有给你任何好处。找出与编译器一起使用的选项,使其更严格。