我有一个相当不寻常的问题。 我已经看到了两个向malloc传递参数的变体。假设我们有:
int *arr = (int *) malloc(sizex * sizeof(*arr));
有些人说使用sizeof(*arr)
很糟糕,你应该使用sizeof(int)
(在这个例子中)。
你能解释一下有什么区别,哪些更好用?
答案 0 :(得分:1)
没有区别。两者都分配相同数量的内存 -
int *arr = (int *) malloc(sizex * sizeof(*arr));
// equivalent to
int *arr = (int *) malloc(sizex * sizeof(int));
但是,有一些事情需要注意。
您不应该投射malloc
的结果。它没用,如果你忘记包含包含其原型的标题stdlib.h
,它实际上可能会导致问题。请阅读此内容 - Do I cast the result of malloc?
我更喜欢上面的第一个版本,因为没有重复的类型信息。此外,它更易于维护,如果您更改类型,那么您只需要在第二种情况下更改它,您需要在两个位置更改它。
应该注意的是sizeof
仅当它是一个类型时才需要括号作为其操作数。因此,它可以更简洁地写成
int *arr = malloc(sizex * sizeof *arr);
// equivalent to
int *arr = malloc(sizex * sizeof(*arr)); // preferred way