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

我想知道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 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]
的数组,但犯了一个错误

很明显,malloc
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
,读取这样的代码非常耗时

至于这个问题
sizeof(char)
始终等于1,并且不依赖于使用的环境。而
sizeof(char*)
是实现定义的,可以等于2、4或8字节,甚至其他值

因此,malloc
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
字节,其中
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);