有什么区别,
malloc ( sizeof ( char ) * N )
和
size_t datalen = N
malloc ( datalen )
我们应该在哪里使用size_t
代替sizeof ( char )
,反之亦然?
size_t
和sizeof ( char )
之间是否存在性能差异?
答案 0 :(得分:3)
size_t
是无符号整数类型,保证支持您使用的平台的最长对象。它也是sizeof
运算符的结果
sizeof
以字节为单位返回类型的大小
因此,在这两种情况下,您都会在size_t
转到malloc
答案 1 :(得分:1)
它不会返回类型size_t的值,因为size_t本身不是具体类型,而是未指定内置类型的typedef。 Typedef标识符(例如size_t)完全等同于它们各自的底层类型(并在编译时转换为它们)。如果size_t在您的平台上定义为unsigned int,则sizeof在您的系统上编译时返回unsigned int。 size_t只是维护可移植性的一种方便方法,如果您按名称明确使用它,则只需要包含在stddef.h中。
此答案是this answer的副本;它最初由用户Volte撰写。
答案 2 :(得分:1)
这就像询问文字42
和类型int
之间是否存在性能差异一样;他们是不同的东西。
使用sizeof(T)
获取T对象使用的字节数。这主要适用于malloc
/ calloc
/ realloc
。
您使用size_t
作为存储该号码的类型。
size_t datalen = N * sizeof(char);
char* pBuf = malloc(datalen);
答案 3 :(得分:0)
在你的例子中,有用性既不是特别明显也不引人注目,问题和代码是有缺陷的 - 如果类型要改变怎么办? datalen = N
的大小不合适。有一个更好的习语,可以更好地利用sizeof; sizeof(char)是没有意义的,因为根据定义,它是1(尽管CHAR_BIT不必是8)
如果要更改动态数组的数据类型,并且您使用sizeof(object)而不是sizeof(type)块进行分配,那么您的代码将变得更容易维护。
e.g。
char* data = malloc(sizeof(*data) * N ) ;
然后如果你以后决定数据应该是int例如:
int* data = malloc(sizeof(*data) * N ) ;
只有一个更改而不是两个(或者在需要其他大小的地方更多)。这对结构和用户定义的类型特别有用:
tSomeType* data = malloc(sizeof(*data) * N ) ;
您可能会通过添加或删除成员来更改类型的大小。