С++ саморегуляционный массив?
Я случайно создал ошибку в программе путем саморегуляции в массиве. Здесь очень упрощенная демо-программа похожа на концепцию:
#include <iostream>
using namespace std;
int kTest[] = {
kTest[0]
};
int main() {
cout << kTest[0] << endl;
}
Я был удивлен, что не получил ни компиляторской ошибки, ни даже предупреждения в этом коде! В моем случае это привело к непредсказуемым результатам. Получает ли доступ к памяти мусора?
Мне было любопытно, при каких обстоятельствах это будет иметь четко определенный результат (если вообще!).
Изменить. Имеет ли значение значение kTest
static
? Что насчет const
? Оба?
Ответы
Ответ 1
int kTest[] = {
kTest[0]
};
аналогичен, если не точно такой же, как
int x = x;
Это будет поведение undefined, если оно объявлено локально в функции.
Кажется, что он корректно определен, когда kTest
является глобальной переменной. Подробнее см. другой ответ.
Ответ 2
Я не уверен, что это undefined. Цитата из текущего draft:
[basic.start.static]/3
Если константная инициализация не выполняется, переменная со статическим длительность хранения ([basic.stc.static]) или длительность хранения потоков ([basic.stc.thread]) инициализируется нулем ([dcl.init]). Вместе, нулевая инициализация и постоянная инициализация называются статическими инициализация; вся другая инициализация - это динамическая инициализация. Статическая инициализация должна выполняться до начала любой динамической инициализации.
Мне кажется, что kTest
уже инициализируется нулем при инициализации динамической инициализации, поэтому его можно определить для инициализации до 0
.