如果在C ??中指定一个整数值,会发生什么?

时间:2014-11-20 18:19:28

标签: c

/*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 ?*/

另外请解释这在内存分配中是如何工作的。

1 个答案:

答案 0 :(得分:2)

无法为C中的指针对象分配一个整数值。

有一种特殊情况,您可以出现这样做。常量0(或更一般地,值为零的整数常量表达式)是空指针常量。但即使在这种情况下,该值也会隐式转换为适当类型的空指针,并且它将存储在{{1}中的空指针值,而不是整数值0。 }。

y

分配是约束违规。这意味着任何符合标准的编译器必须为包含它的程序发出诊断消息。基本上它意味着赋值是非法的(尽管C标准并没有这样称呼它)。它和

一样有意义
int *y;
y = 36;

在非常旧的C版本中,在语言标准化之前,通常允许为指针分配任意整数值。因此,许多编译器将允许这样的分配,并且只打印警告而不是致命的错误消息。这里的教训不是它不是一个严重的错误。经验教训是,应该假设编译器警告(至少其中一些)与致命错误消息一样严重。

现在可以做的是使用强制转换显式将整数值转换为指针类型:

double x = "hello, world";

正如标准所说,这种转换的结果

  

是实现定义的,可能没有正确对齐,可能没有   指向引用类型的实体,可能是陷阱   表示。

如果您尝试读取或写入y = (int*)36; 指示的对象,则您的程序行为未定义。 如果您很幸运,它将崩溃并显示错误消息。如果你运气不好,它可能会表现得正确"。

在极不可能的情况下,您碰巧知道您可以在机器地址*y访问int个对象(更有可能表示为36),这将是访问它的方式。

除非您在嵌入式系统上进行非常低级别的编程,否则几乎可以肯定该地址上没有此类可访问的0x24对象。

底线:不要这样做。如果你的编译器让你逃脱它,它真的没有给你任何好处。找出与编译器一起使用的选项,使其更严格。