在详细研究malloc()时,我发现了这种奇怪的行为。
int *p;
p=(int*)malloc(10.45);
p=(int*)malloc(10.45f);
p=(int*)malloc('j');
程序只使用警告编译任何这些语句并返回有效地址。 这里真正的结果是什么?
答案 0 :(得分:5)
在调用函数之前,所有这些值都隐式转换为size_t
,就像你有一个显式的强制转换一样。浮点数被截断,'j'
被解释为字符集中的数值。
答案 1 :(得分:3)
"只是警告"可能隐藏了解释。
用于将非整数类型的值转换/提升为整数的各种规则,确保malloc()
获得单个size_t
,即无符号整数。例如,浮点调用可能只会丢弃分数,并尝试分配10个字节。
答案 2 :(得分:3)
malloc()
采用size_t参数。
编译器会将10.45
/ 10.45f
截断为10
并将'j'
转换为其ASCII值(106
)。
这是size_t
答案 3 :(得分:2)
Malloc定义为接受整数'字节数'。
C语言定义了从其他数据类型转换为整数的规则。
我相信你可以自己解决每个价值所转化的问题。