C++ новый интервал [0] — это выделит память?

Вам может потребоваться преобразование в обе стороны, например, из столбца Excel, например AAZ, в целое число и из любого целого числа в Excel. Два метода ниже сделают именно это. При условии индексации на основе 1, первым элементом в ваших «массивах» является элемент номер 1. Здесь нет ограничений по размеру, поэтому вы можете использовать адреса, такие как ОШИБКА, и это будет номер столбца 2613824 ...

public static string ColumnAdress(int col)
{
  if (col <= 26) { 
    return Convert.ToChar(col + 64).ToString();
  }
  int div = col / 26;
  int mod = col % 26;
  if (mod == 0) {mod = 26;div--;}
  return ColumnAdress(div) + ColumnAdress(mod);
}

public static int ColumnNumber(string colAdress)
{
  int[] digits = new int[colAdress.Length];
  for (int i = 0; i < colAdress.Length; ++i)
  {
    digits[i] = Convert.ToInt32(colAdress[i]) - 64;
  }
  int mul=1;int res=0;
  for (int pos = digits.Length - 1; pos >= 0; --pos)
  {
    res += digits[pos] * mul;
    mul *= 26;
  }
  return res;
}
228
задан 6 July 2009 в 02:42
поделиться

4 ответа

Начиная с 5.3.4 / 7

Когда значение выражения в деклараторе прямого-нового равно нулю, вызывается функция распределения для выделения массива без элементов.

Из 3.7.3.1/2

Эффект разыменования указателя, возвращенного как запрос нулевого размера, не определен.

Также

Даже если размер запрошенного [новым] пространства равен нулю, запрос может потерпеть неудачу.

Это означает, что вы можете это сделать, но вы не можете юридически (четко определенным образом на всех платформах) разыменовать память, которую вы получаете - вы можете только передать ее на удаление массива - и вы должны удалить ее.

Вот интересная сноска (т. Е. Не нормативная часть стандарта, но включена в пояснительных целях), приложенная к предложению из 3.7.3.1/2

[32. Намерение состоит в том, чтобы оператор new () мог быть реализован путем вызова malloc () или calloc (), поэтому правила в основном те же. C ++ отличается от C тем, что требует нулевого запроса для возврата ненулевого указателя.]

229
ответ дан 23 November 2019 в 03:47
поделиться

Да, размещение массива нулевого размера допустимо. Но вы также должны удалить его.

21
ответ дан 23 November 2019 в 03:47
поделиться

Да, размещение блока размером 0 с помощью new вполне допустимо. Вы просто не можете сделать с ним ничего полезного, поскольку у вас нет достоверных данных, к которым вы могли бы получить доступ. int [0] = 5; недопустимо.

Однако я считаю, что стандарт позволяет таким вещам, как malloc (0) , возвращать NULL .

Вам все равно потребуется удалить [] любой указатель, который вы получите обратно из выделения.

14
ответ дан 23 November 2019 в 03:47
поделиться

Что об этом сказано в стандарте? Всегда ли разрешено «выделять» пустой блок памяти?

Каждый объект имеет уникальный идентификатор, то есть уникальный адрес, который подразумевает ненулевую длину (фактический объем памяти будет незаметно увеличен, если вы попросите нулевые байты).

Если вы выделили более одного из этих объектов, вы обнаружите, что они имеют разные адреса.

15
ответ дан 23 November 2019 в 03:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: