Почему аргумент для malloc i + 1 в этом C-коде? - PullRequest
2 голосов
/ 25 февраля 2012

Обычно 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 ]

13 голосов
/ 25 февраля 2012

Если вы хотите выделить массив какого-либо типа, вы обычно умножаете количество нужных вам элементов на размер этого типа, потому что malloc принимает размер массива в байт .

Однако массив char - это особый случай; вам не нужно умножать количество элементов, которое вы хотите, на sizeof(char), потому что sizeof(char) определяется стандартом на всегда быть 1, а умножение на 1 дает другой операнд.

+ 1 должен освободить место для терминатора NUL. Если вам нужна строка длиной n, ваш массив должен иметь длину n + 1; n пробелы для n символов строки и 1 пробелы для терминатора.

Кстати, вы не должны разыгрывать возвращаемое значение malloc. Это сделает ваш код легче изменить в будущем.

3 голосов
/ 25 февраля 2012

C-строки заканчиваются нулем, см .:

например. «abc» представляется как «abc» + NUL. Таким образом, для строки длиной i необходимо выделить i + 1. Поскольку вы выделяете символы, sizeof (char) равен 1, поэтому вам действительно нужно выделить 1 * (i + 1), но это то же самое.

2 голосов
/ 25 февраля 2012

Если для размещения строки требуется достаточное количество памяти для количества символов, + еще 1 для нулевого символа, обозначающего конец строки (\ 0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...