我不知道这是否可能,但我很困惑。它们是一样的吗?我知道在第一种情况下,我们为20个int类型的元素动态分配内存。
int *p; p=(int *) malloc(20*sizeof(int));
字符串和/或
p=(int *) malloc(sizeof(int)*20);
型
szqfcxe21#
回想一下sizeof运算符返回的类型:size_t的值。在int * size_t(20*sizeof(int))与size_t * int(sizeof(int) * 20)的情况下:乘积与较窄的类型相同,首先加宽到另一个,并且C中的乘法是 * 交换的 *:a*b等于b*a。情况随着int * int * size_t和size_t * int * int而变化,如C中一样,乘法不是 * 结合 *。第一次乘以int * int(与int乘积),然后乘以int * size_t。对于选择值,第一次乘法可能会溢出,而size_t * int * int不会。当两个以上的对象可以相乘时,最好确保最宽的乘法首先发生,然后发生:示例size_t * int * int。这两者有什么区别吗?只有两个对象相乘,可以用任何你喜欢的方式编码。我喜欢用可能更宽的类型开头。由于不需要强制转换,并且调整到对象更容易正确编码,因此检查和维护,请考虑:
sizeof
size_t
int * size_t
20*sizeof(int)
size_t * int
sizeof(int) * 20
a*b
b*a
int * int * size_t
size_t * int * int
int * int
int
p = malloc(sizeof p[0] * 20); if (p == NULL) { TBD(); // Handle out-of-memory }
字符串
1条答案
按热度按时间szqfcxe21#
回想一下
sizeof
运算符返回的类型:size_t
的值。在
int * size_t
(20*sizeof(int)
)与size_t * int
(sizeof(int) * 20
)的情况下:乘积与较窄的类型相同,首先加宽到另一个,并且C中的乘法是 * 交换的 *:a*b
等于b*a
。情况随着
int * int * size_t
和size_t * int * int
而变化,如C中一样,乘法不是 * 结合 *。第一次乘以int * int
(与int
乘积),然后乘以int * size_t
。对于选择值,第一次乘法可能会溢出,而size_t * int * int
不会。当两个以上的对象可以相乘时,最好确保最宽的乘法首先发生,然后发生:示例
size_t * int * int
。这两者有什么区别吗?
只有两个对象相乘,可以用任何你喜欢的方式编码。
我喜欢用可能更宽的类型开头。
由于不需要强制转换,并且调整到对象更容易正确编码,因此检查和维护,请考虑:
字符串