如果用 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 ?*/

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

不能在 C 中为指针对象赋值。

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

int *y;
y = 36;

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

double x = "hello, world";

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

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

y = (int*)36;

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

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

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

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

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

一句话:不要那样做。如果你的编译器让你侥幸逃脱,它真的对你没有任何好处。了解与编译器一起使用哪些选项以使其更加严格。

最新更新