【发布时间】:2015-08-05 16:16:13
【问题描述】:
我正在查看here,发现如果我们不包含 stdlib.h、强制转换返回值以及系统上的指针和整数大小不同,malloc 可能会导致不需要的行为。
下面是那个 SO 问题中给出的代码 sn-p。这是在指针和整数大小不同的 64 位机器上尝试的。
int main()
{
int* p;
p = (int*)malloc(sizeof(int));
*p = 10;
return 0;
}
如果我们不包含stdlib.h,编译器将假定malloc 返回类型为int,并且将其转换并分配给不同大小的指针可能会导致不需要的行为。 但我的问题是为什么将 int 转换为 int* 并将其分配给不同大小的指针会导致问题。
【问题讨论】:
-
首先,它被(隐式)转换为
int,因此从8字节截断为4字节。除非原始 8 字节值的前 4 个字节(更重要的)包含全零,否则会丢失一些信息。将结果转换回int*不会检索到该信息,从而为您留下一个“虚假”指针。 -
当编译器遇到“int *p”声明时,它会在声明时确定该指针需要 8 个字节(例如)的存储空间。接下来,在运行时,当 malloc 被执行时,它返回一个默认的“int”,因为不存在函数原型声明(由于缺少 stdlib.h)。当新分配的内存的地址(8 字节)存储在 int(4 字节)中并返回给您时,可能会失去意义。现在,此时如果您尝试将 int 强制转换为 int * 并将其分配给您的指针 'p' ...可能会出现意外行为。