为什么在这个C代码中malloc i + 1的参数?

时间:2012-02-25 03:09:48

标签: c malloc

通常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);

3 个答案:

答案 0 :(得分:13)

如果你想分配某种类型的数组,你通常会将你想要的元素数乘以该类型的大小,因为malloc采用字节中数组的大小

但是,char数组是一个特例;您不需要将sizeof(char)所需的元素数乘以,因为标准将sizeof(char)定义为始终1,并乘以1产生另一个操作数。

+ 1是为NUL终结者腾出空间。如果您想要一个长度为n的字符串,则您的数组必须长度为n + 1;字符串的n个字符为n个空格,终结符为1个空格。

顺便说一句,你不应该转换malloc的返回值。它将使您的代码在将来更容易更改。

答案 1 :(得分:3)

C字符串以空值终止,请参阅:

E.g。 “abc”表示为“abc”+ NUL。因此,对于长度为i的字符串,您需要分配i + 1。当您分配字符时,sizeof(char)为1,因此您实际需要分配1 * (i + 1),但这是相同的。

答案 2 :(得分:2)

如果为字符串分配,则需要足够的内存用于字符数+为表示字符串结尾的空字符添加1个额外字符(\ 0)