提问人:blogger10 提问时间:7/3/2023 最后编辑:user207421blogger10 更新时间:7/26/2023 访问量:92
这两者之间有什么区别吗?
Is there any difference between these two?
问:
我不知道这是否可能,但我很困惑。 它们都是一样的吗? 我知道在第一种情况下,我们正在为 int 类型的 20 个元素动态分配内存。
int *p;
p=(int *) malloc(20*sizeof(int));
和
p=(int *) malloc(sizeof(int)*20);
答:
2赞
chux - Reinstate Monica
7/3/2023
#1
回想一下,运算符返回 type: 。sizeof
size_t
在 () 与 () 的情况下,乘积相同,因为较窄的类型首先扩大到另一个类型,并且 C 中的乘法是可交换的:等于 。int * size_t
20*sizeof(int)
size_t * int
sizeof(int) * 20
a*b
b*a
情况随着 vs 的变化而变化,就像在 C 中一样,乘法不是关联的。第一个倍数(带有乘积),然后做 .使用选择值时,第一个乘法可能会溢出,而不会。int * int * size_t
size_t * int * int
int * int
int
int * size_t
size_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 * int
size_t * int * int
int * int *size_t
评论
20*sizeof(int)
sizeof(int)*20
amount_of_space_for_int * 20
20 * amount_of_space_for_int
void*
malloc()
sizeof
p = malloc(20 * sizeof *p);
sizeof
:)