Что/означает распределение массива нулевого размера?

Это не самый симпатичный способ сделать это, но по-моему, это - лучший способ.

def loop():
    while True:
    #snip: print out current state
        while True:
            ok = get_input("Is this ok? (y/n)")
            if ok == "y" or ok == "Y": return
            if ok == "n" or ok == "N": break
        #do more processing with menus and stuff

я вполне уверен, Вы могли разработать что-то с помощью рекурсии здесь также, но я не знаю, является ли это хорошим вариантом для Вас.

5
задан dubnde 11 August 2009 в 11:32
поделиться

4 ответа

5.3.4 в стандарте C ++:

6 Каждое константное выражение в direct-new-declarator должно быть интегральной константой выражение (5.19) и получим строго положительное значение. Выражение в direct-new-declarator должно иметь целочисленный или перечисляемый тип (3.9.1) с неотрицательным значением ...

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

Итак, ваш код выделяет массив, который ведет себя в каждом уважать, как и любой другой массив T (можно удалить с помощью delete [], переданного в качестве параметра, возможно, других вещей). Однако у него нет доступных индексов (то есть чтение или запись ptr [0] приводит к неопределенному поведению).

В этом контексте различие между константным выражением и выражением заключается не в том, является ли фактическое выражение постоянной времени компиляции (которое, очевидно, равно 0), а в том, определяет ли оно «последнее» измерение многомерного массива. Синтаксис определен в 5.3.4: 1.

8
ответ дан 13 December 2019 в 22:12
поделиться

Разрешено (5.3.4 / 6). Его результатом является пустой массив, поэтому возвращаемое значение является указателем за массивом.

2
ответ дан 13 December 2019 в 22:12
поделиться

Да, это допустимое поведение, и ptr будет действительным. Конструкция переносима для всех компиляторов C ++, которые соответствуют стандарту C ++. Он полезен тем, что позволяет вам писать код, который не требует специального инструментария для обработки случая, когда количество элементов равно нулю.

Однако, как всегда, вам будет удобнее использовать std: : вектор (который также может иметь нулевой размер) вместо массива.

0
ответ дан 13 December 2019 в 22:12
поделиться

Связанный вопрос: Что должен возвращать malloc (0)?

И из некоторых документов C99 поведение malloc (0) определяется реализацией:

Независимо от того, являются ли calloc, malloc и функции realloc возвращают нуль указатель или указатель на выделенный объект, когда запрошенный размер равен нулю (7.20.3).

Либо нулевой указатель, либо уникальный указатель, который можно передать в free () возвращается.

См. справочную страницу malloc (3C).

Конечно, вы спрашиваете о C ++, но информация о malloc в любом случае может пригодиться.

0
ответ дан 13 December 2019 в 22:12
поделиться
Другие вопросы по тегам:

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