通常一个malloc包含sizeof
,但这个没有,而是有i+1:
int main ()
{
int i,n;
char * buffer;
printf ("How long do you want the string? ");
scanf ("%d", &i);
buffer = (char*) malloc (i+1);
if (buffer==NULL) exit (1);
如果您想分配某种类型的数组,通常会将所需元素的数量乘以该类型的大小,因为malloc
采用字节中的数组大小。
然而,char
的数组是一种特殊情况;不需要将所需的元素数乘以sizeof(char)
,因为标准将sizeof(char)
定义为始终为1
,而乘以1将产生另一个操作数。
+ 1
是为NUL
端接器腾出空间。如果您想要长度为n
的字符串,那么您的数组的长度必须为n + 1
;用于字符串的n
字符的n
空间和用于终止符的1
空间。
顺便说一下,您不应该强制转换malloc
的返回值。它将使您的代码在未来更容易更改。
C字符串以null结尾,请参阅:
- http://en.wikipedia.org/wiki/Null-terminated_string
例如,"abc"表示为"abc"+NUL。因此,对于长度为i
的字符串,您需要分配i + 1
。在分配字符时,sizeof(char)为1,因此实际上需要分配1 * (i + 1)
,但这是相同的。
如果它为字符串分配,则需要足够的内存来容纳字符数+1个额外的空字符,该空字符表示字符串的末尾(\0)