这两者之间有什么区别吗?

Is there any difference between these two?

提问人:blogger10 提问时间:7/3/2023 最后编辑:user207421blogger10 更新时间:7/26/2023 访问量:92

问:

我不知道这是否可能,但我很困惑。 它们都是一样的吗? 我知道在第一种情况下,我们正在为 int 类型的 20 个元素动态分配内存。

int *p;
p=(int *) malloc(20*sizeof(int));

p=(int *) malloc(sizeof(int)*20);
c 乘法 关联性

评论

3赞 robthebloke 7/3/2023
它们都是一样的。乘法是可交换的,因此等价于 。malloc 只获取要分配的字节数,因此无论哪种方式都会给出正确的结果 - 例如 V.S.20*sizeof(int)sizeof(int)*20amount_of_space_for_int * 2020 * amount_of_space_for_int
2赞 user207421 7/3/2023
这与指针malloc 无关。C 中的任何乘法运算符以及加法等其他运算符也是如此。
1赞 the busybee 7/3/2023
OT #1:在 C 中,没有必要因此不赞成将返回的 .void*malloc()
3赞 the busybee 7/3/2023
OT #2:与其使用类型操作,不如将其与取消引用的目标一起使用:(请注意,这是一个运算符,而不是一个函数)。sizeofp = malloc(20 * sizeof *p);sizeof
1赞 David C. Rankin 7/3/2023
@chux -- 是的,谢谢你的收获!关联是分组...当你拥有基础数学已经超过 45 年时,就会发生这种情况:)

答:

2赞 chux - Reinstate Monica 7/3/2023 #1

回想一下,运算符返回 type: 。sizeofsize_t

在 () 与 () 的情况下,乘积相同,因为较窄的类型首先扩大到另一个类型,并且 C 中的乘法是可交换的:等于 。int * size_t20*sizeof(int)size_t * intsizeof(int) * 20a*bb*a

情况随着 vs 的变化而变化,就像在 C 中一样,乘法不是关联的。第一个倍数(带有乘积),然后做 .使用选择值时,第一个乘法可能会溢出,而不会。int * int * size_tsize_t * int * intint * intintint * size_tsize_t * int * int

当可以乘以 2 个以上的对象时,最好确保最广泛的乘法首先发生,然后发生:示例。size_t * int * int


这两者之间有什么区别吗?

只需 2 个对象即可相乘,以您喜欢的任何方式进行编码。
我喜欢以可能更广泛的类型为主导。


由于不需要强制转换,并且对象的大小调整更容易正确编码、审查和维护,因此请考虑:

p = malloc(sizeof p[0] * 20);
if (p == NULL) {
  TBD(); // Handle out-of-memory
}

评论

1赞 Lundin 7/3/2023
关于编码风格相当主观的论点,请查看如何正确使用 malloc?
0赞 12431234123412341234123 7/3/2023
size_t * int * int也可以溢出。
0赞 chux - Reinstate Monica 7/3/2023
@Lundin 在审查可兼容的代码 vs. 时,第一个从表面上看是正确的。第二个要求寻找定义,然后是它的类型。类型定义很可能位于另一个文件中。关于“更容易正确编码、审查和维护”,审查部分是使用对象大小而不是使用类型大小的审查部分。与此类样式问题一样,最好按照小组的编码标准进行编码,因为这个问题有很多根深蒂固的问题。p.member = malloc(sizeof p.member[0])p.member = malloc(sizeof(int))p
1赞 chux - Reinstate Monica 7/3/2023
@12431234123412341234123确实可以溢出,但对于许多组合来说不会溢出。size_t * int * intsize_t * int * intint * int *size_t
1赞 chux - Reinstate Monica 7/4/2023
@Lundin 如前所述,正在审查中的优势。这不是关于编写代码,而是其他人(不是原始的,也许是初级作者)审查。IDE 在可用时可能会有所帮助,但不适用于此处的代码审查或代码审查等。1 单击查找仍然超过 0 。当上下文无关紧要时,甚至不需要上下文是一个很好的理性。p = malloc(sizeof p[0])sizeof p[0]