GCC警告:初始化';int32_t*';{aka';int*';}来自';int';从整数生成指针,无需强制转换[-Wint转换]

GCC警告:初始化';int32_t*';{aka';int*';}来自';int';从整数生成指针,无需强制转换[-Wint转换],c,pointers,gcc-warning,C,Pointers,Gcc Warning,这是一个C程序: #包括 #包括 int main(){ int32_t*ptr=5; printf(“ptr是%p\n”,ptr); printf(“++ptr为%p\n”,++ptr); } 其目的是用文本地址(例如5)初始化指针,并查看它在递增后的变化 gcc产生以下警告 warning: initialization of 'int32_t *' {aka 'int *'} from 'int' makes pointer from integer without a cast [-W

这是一个C程序:

#包括
#包括
int main(){
int32_t*ptr=5;
printf(“ptr是%p\n”,ptr);
printf(“++ptr为%p\n”,++ptr);
}
其目的是用文本地址(例如
5
)初始化指针,并查看它在递增后的变化

gcc
产生以下警告

warning: initialization of 'int32_t *' {aka 'int *'} from 'int' makes pointer from integer without a cast [-Wint-conversion]
    6 |     int32_t *ptr = 5;
      |                    ^

避免此警告的一般方法是什么?

“强制转换”一词是否用作“显式强制转换”的同义词,因此预期的修复方法如下所示

int32_t*ptr=(int32_t*)5;
或者,指针文本是否有特殊的语法



出于程序的目的,可以声明一个附加变量以使用其地址初始化指针(如
int32\u t x,*ptr=&x
),甚至可以不初始化指针,但问题是关于这个特定的警告和用文本值初始化指针。

您可以通过显式强制转换来消除警告,如图所示:

int32_t *ptr = (int32_t *)5;

但是,地址5很可能不是您的进程允许写入的地址,它将调用并很可能崩溃。

除了0之外,没有任何porttable方法可以用文本地址初始化指针。有时我会看到像
T*ptr=(T*)1
如果您需要除
NULL
之外的另一个特殊值,但我怀疑该标准是否涵盖了这一点。当指针未被普遍初始化时,执行指针算术总是调用未定义的行为什么是“正确初始化的指针”,它与“不正确初始化的指针”有何不同?“未正确初始化的指针”与“未初始化的指针”不同吗?这个
int*p;p=(void*)5重复:““强制转换”一词用作“显式强制转换”的同义词“强制转换”总是显式的。强制转换是程序员完成的显式转换。与C语言编译器完成的隐式转换相反。