-4

在详细研究 malloc() 时,我遇到了这种奇怪的行为。

int *p;
p=(int*)malloc(10.45);
p=(int*)malloc(10.45f);
p=(int*)malloc('j');

该程序使用这些语句中的任何一个进行编译,只发出警告并返回一个有效地址。这里的真正结果是什么?

4

4 回答 4

5

在调用函数之前,所有这些值都被隐式转换为size_t,就像您进行了显式转换一样。浮点数被截断,并被'j'解释为其字符集中的数值。

于 2013-09-02T14:49:04.537 回答
3

“只是一个警告”可能隐藏了解释。

用于将非整数类型的值转换/提升为整数的各种规则开始生效,确保malloc()获得单个size_t,即无符号整数。例如,浮点调用可能只会删除分数,并尝试分配 10 个字节。

另外,请不要malloc()在 C中转换返回值。

于 2013-09-02T14:49:32.950 回答
3

malloc()接受一个 size_t 参数。

编译器会将10.45/10.45f截断10并转换'j'为其 ASCII 值 ( 106)。

这是一个隐式转换size_t

于 2013-09-02T14:49:41.247 回答
2

Malloc 被定义为接受整数“字节数”。

C 语言定义了从其他数据类型转换为整数的规则。

我相信您可以自己计算出每个值转换为的内容。

于 2013-09-02T14:49:20.890 回答