sizeof(char)和sizeof(char *)之间的区别

时间:2016-11-18 14:42:37

标签: c malloc sizeof

我想知道sizeof(char)和sizeof(char *)之间是否存在差异:

char *s;
s = malloc(sizeof(char*)*len + 1);

char *s;
s = malloc(sizeof(char)*len + 1);

这是一样的吗?

3 个答案:

答案 0 :(得分:11)

char是一个字符,sizeof(char)定义为1.(N1570 6.5.3.4 sizeof和_Alignof运算符,第4段)

char*是指向字符的指针,sizeof(char*)取决于环境。它通常在32位环境中为4,在64位环境中为8。

sizeof(char*) > sizeof(char)的典型环境中,如果malloc(sizeof(char*)*len + 1)足够小而不会导致整数溢出,malloc(sizeof(char)*len + 1)将(至少尝试)分配比len更多的内存。< / p>

答案 1 :(得分:0)

他们不一样。 char*是指向char的指针。您错误地将char*误解为&#34;类型&#34;本身。

char的大小为1,作为指针的char*在32位系统上可以是4,在64位系统上可以是8(前提是按照系统编译)。

答案 2 :(得分:-2)

首先,这是一个很好的例子,表明{C <1}} 应该在C中投放

让我们考虑一下这段代码

malloc

阅读它并不清楚代码的作者将要做什么。他是否想要分配类型为char *s; s = malloc(sizeof(char*)*len + 1); 的字符数组,或者他想分配类型char[sizeof( char * ) *len + 1]char *[len + 1]的数组,但却犯了错误?

很明显,malloc char *[len]中的这种表达方式会使读者感到困惑,而且容易出错。

但是,如果作者写了例如

malloc(sizeof(char*)*len + 1)

然后编译器将报告诊断消息。或者,如果他写了

s = ( char ** )malloc(sizeof(char*)*len + 1);
然后,作者的意图就会更清楚了。

此外,在指针声明和分配内存的语句之间,可能有许多代码行的屏幕,最差的声明可以在一个文件中,而另一个文件中的分配语句。

s = ( char * )malloc(sizeof(char*)*len + 1);

不投射char *s; //.... //.... s = malloc(sizeof(char*)*len + 1); ,阅读此类代码非常耗时。

至于问题。 malloc始终等于1,并且不依赖于使用的环境。虽然sizeof( char )是实现定义的,但可以等于例如2,4或8个字节甚至是其他字节。

因此,malloc sizeof( char * )中的这个表达式完全等同于此调用中的表达式malloc(sizeof(char)*len + 1)再次看不到这个语句

malloc( len + 1)

动态分配什么类型的对象。是否分配了一个字符数组或者例如s = malloc(len + 1); char ( * )[2]等字符的二维数组 - 是偶数,而len + 1添加了1,因为len是奇数,甚至是分配了其他类型的对象。

所以编写

要好得多
len

此代码是自我记录的,易于阅读。

因此这两个陈述之间存在差异

s = ( char * )malloc(sizeof(char)*len + 1);
    ^^^^^^^^^

是第一个语句分配内存范围为s = malloc(sizeof(char)*len + 1); s = malloc(sizeof(char*)*len + 1); 个字节,而第二个语句分配len + 1个字节的范围,其中sizeof( char * ) * len + 1除外,非常罕见的情况大于1