在详细研究 malloc() 时,我遇到了这种奇怪的行为。
int *p;
p=(int*)malloc(10.45);
p=(int*)malloc(10.45f);
p=(int*)malloc('j');
该程序使用这些语句中的任何一个进行编译,只发出警告并返回一个有效地址。这里的真正结果是什么?
在调用函数之前,所有这些值都被隐式转换为size_t
,就像您进行了显式转换一样。浮点数被截断,并被'j'
解释为其字符集中的数值。
“只是一个警告”可能隐藏了解释。
用于将非整数类型的值转换/提升为整数的各种规则开始生效,确保malloc()
获得单个size_t
,即无符号整数。例如,浮点调用可能只会删除分数,并尝试分配 10 个字节。
另外,请不要malloc()
在 C中转换返回值。
malloc()
接受一个 size_t 参数。
编译器会将10.45
/10.45f
截断10
并转换'j'
为其 ASCII 值 ( 106
)。
这是一个隐式转换size_t
Malloc 被定义为接受整数“字节数”。
C 语言定义了从其他数据类型转换为整数的规则。
我相信您可以自己计算出每个值转换为的内容。