sizeof(char)和sizeof(char*)之间的差异
我想知道sizeof(char)和sizeof(char*)之间是否有区别:sizeof(char)和sizeof(char*)之间的差异,c,malloc,sizeof,C,Malloc,Sizeof,我想知道sizeof(char)和sizeof(char*)之间是否有区别: 这是相同的吗?char是一个字符,sizeof(char)被定义为1。(6.5.3.4运营商的规模和规模,第4段) char*是指向字符的指针,并且sizeof(char*)取决于环境。它在32位环境中通常为4,在64位环境中为8 在sizeof(char*)>sizeof(char)的典型环境中,malloc(sizeof(char*)*len+1)将(至少尝试)分配比malloc(sizeof(char)*len
这是相同的吗?
char
是一个字符,sizeof(char)
被定义为1。(6.5.3.4运营商的规模和规模,第4段)
char*
是指向字符的指针,并且sizeof(char*)
取决于环境。它在32位环境中通常为4,在64位环境中为8
在
sizeof(char*)>sizeof(char)
的典型环境中,malloc(sizeof(char*)*len+1)
将(至少尝试)分配比malloc(sizeof(char)*len 1)更多的内存,如果len
足够小而不会导致整数溢出。它们不一样char*
是指向char
的指针。您将char*
本身误解为“类型”
char
的大小为1,而char*
指针在32位系统上可以是4,在64位系统上可以是8(前提是它是按照系统编译的)。首先,这是一个很好的例子,表明malloc
应该用C进行浇铸
让我们考虑这个代码片段
char *s;
s = malloc(sizeof(char*)*len + 1);
阅读它,不清楚代码的作者将要做什么。他是想分配一个类型为char[sizeof(char*)*len+1]
的字符数组,还是想分配一个类型为char*[len+1]
或char*[len]
的数组,但犯了一个错误
很明显,mallocmalloc(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
,读取这样的代码非常耗时
至于这个问题sizeof(char)
始终等于1,并且不依赖于使用的环境。而sizeof(char*)
是实现定义的,可以等于2、4或8字节,甚至其他值
因此,mallocmalloc(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
字节,其中sizeof(char*)
大于1,非常罕见的情况除外。char
!=<代码>字符*
char
是字符,char*
是指向char
的指针。一个是单个字符,另一个是指向字符的指针。差别很大。您还可以尝试打印由sizeof
sizeof(char)
=1字节、sizeof(char*)
=4/8字节给出的值。您必须询问两者之间的共同点,而不是区别。好的,谢谢您的解释,所以在我的例子中,我应该使用sizeof(char),因为我想分配一个字符串。@Flaz那么,使用s=malloc(len+1)
就足够了。是的,现在有意义了。
s = malloc(sizeof(char)*len + 1);
s = malloc(sizeof(char*)*len + 1);