这两个语句的含义是否与p指向地址位置10的含义相同?在编译时,第一次初始化会给出一些警告。这是什么意思?
#include <stdio.h>
int main()
{
int *p = 10;
int *q = (int *)10;
return 0;
}输出:
warning: initialization of ‘int *’ from ‘int’ makes pointer from integer without a cast [- Wint-conversion]发布于 2021-11-20 03:33:45
这两种情况都会将整数10转换为用于初始化int *的指针类型。第二种情况下的强制转换明确表明此行为是故意的。
虽然允许从整数转换为指针,但赋值运算符(以及扩展的初始化)并不明确允许这种转换,因此强制转换要求它是一致的。然而,许多编译器仍然允许这样做,并简单地发出警告(就像您显然所做的那样)。
但是,请注意,除非您在支持读取或写入特定内存地址的嵌入式系统上,否则实际尝试使用分配了特定数值的指针很可能会导致崩溃。
发布于 2021-11-20 03:42:17
int *p = 10;不正确(违反约束),编译器必须生成诊断消息。编译器可能会拒绝该程序,如果不拒绝,则不会定义任何行为。规则是指针的初始值必须是兼容的指针值或空指针常量。
int *q = (int *)10;表示将整数10转换为指针。结果是实现定义的,它可能是一个陷阱表示,这意味着如果执行到达此行,初始化会导致未定义的行为。
发布于 2021-11-20 03:36:56
int和指向整数int*的指针是不同的类型。第一行上的10是一个int,您试图将其赋给指向int类型的指针。因此出现了警告。(在X86上,两者共享相同的大小,但考虑到这一点主要是巧合)。
通过将int转换为指针,就像你在第二行所做的那样,你是在告诉编译器“嘿,我知道这是不同的类型,但我知道我在做什么,所以继续下去,把值10当作指针,因为我真的想指向地址为10的内存”。(在几乎所有情况下,10的内存地址都不会被您使用)
https://stackoverflow.com/questions/70043029
复制相似问题