C语言 这两者有什么区别吗?

k2fxgqgv  于 2023-08-03  发布在  其他
关注(0)|答案(1)|浏览(92)

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

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

字符串
和/或

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

szqfcxe2

szqfcxe21#

回想一下sizeof运算符返回的类型:size_t的值。
int * size_t20*sizeof(int))与size_t * intsizeof(int) * 20)的情况下:乘积与较窄的类型相同,首先加宽到另一个,并且C中的乘法是 * 交换的 *:a*b等于b*a
情况随着int * int * size_tsize_t * int * int而变化,如C中一样,乘法不是 * 结合 *。第一次乘以int * int(与int乘积),然后乘以int * size_t。对于选择值,第一次乘法可能会溢出,而size_t * int * int不会。
当两个以上的对象可以相乘时,最好确保最宽的乘法首先发生,然后发生:示例size_t * int * int
这两者有什么区别吗?
只有两个对象相乘,可以用任何你喜欢的方式编码。
我喜欢用可能更宽的类型开头。
由于不需要强制转换,并且调整到对象更容易正确编码,因此检查和维护,请考虑:

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

字符串

相关问题