我想知道sizeof(char)和sizeof(char *)之间是否存在差异:
char *s;
s = malloc(sizeof(char*)*len + 1);
char *s;
s = malloc(sizeof(char)*len + 1);
这是一样的吗?
答案 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