指定指针
在 64 位方式下,指针和 int 类型不再 具有 相同的大小。 它造成的影响如下:
- 交换指针和
int类型将导致分段故障。 - 将指针传递到期望
int类型的函数会导致截断。 - 返回指针但是未显式进行此类原型化的函数改为返回
int,并截断生成的指针,如以下示例中所示。在 C 中,在没有原型的情况下,以下代码在 32 位方式下有效:a=(char*) calloc(25);
如果没有 calloc 的函数原型,那么在 64 位方式下编译相同代码时,编译器会假定函数返回 int,因此将截断 a 并且不进行通知,然后对其进行符号扩展。 对结果的强制类型转换不会阻止截断,因为返回期间已截断 calloc 分配的内存地址。 在此示例中,最佳解决方案是包含头文件 stdlib.h,其中包含 calloc 的原型。 另一个解决方案是如头文件中一样原型化函数。
为避免这些类型的问题,您可以采用以下措施:
- 原型化返回指针的任何函数,在可能的情况下使用相应的头文件。
- 确保传递到函数、指针或
int调用中的参数类型与所调用函数期望的类型相匹配。 - 对于将指针视为整数类型的应用程序,请使用类型
long或unsigned long在 32 位 或 64 位方式下。
使用 -qwarn64 选项,可在列表文件中获取有关潜在问题的警告信息。