指定指针

在 64 位方式下,指针和 int 类型不再 具有 相同的大小。 它造成的影响如下:

  • 交换指针和 int 类型将导致分段故障。
  • 将指针传递到期望 int 类型的函数会导致截断。
  • 返回指针但是未显式进行此类原型化的函数改为返回 int,并截断生成的指针,如以下示例中所示
    在 C 中,在没有原型的情况下,以下代码在 32 位方式下有效:
    a=(char*) calloc(25);

如果没有 calloc 的函数原型,那么在 64 位方式下编译相同代码时,编译器会假定函数返回 int,因此将截断 a 并且不进行通知,然后对其进行符号扩展。 对结果的强制类型转换不会阻止截断,因为返回期间已截断 calloc 分配的内存地址。 在此示例中,最佳解决方案是包含头文件 stdlib.h,其中包含 calloc 的原型。 另一个解决方案是如头文件中一样原型化函数。

为避免这些类型的问题,您可以采用以下措施

  • 原型化返回指针的任何函数,在可能的情况下使用相应的头文件。
  • 确保传递到函数、指针或 int 调用中的参数类型与所调用函数期望的类型相匹配。
  • 对于将指针视为整数类型的应用程序,请使用类型 longunsigned long32 位 或 64 位方式下
  • 基于 XL 的前端开始使用 -qwarn64 选项,可在列表文件中获取有关潜在问题的警告信息。