инструкция goto для перехода вперед массива переменной длины

int main() {
    int sz = 10; 
    goto end;
    char bytes[sz];
end:
    return 0;
}

Я получаю следующую ошибку при компиляции. Я использую gcc со стандартом C99.

test.c: In function ‘main’:
test.c:3:2: error: jump into scope of identifier with variably modified type
test.c:5:1: note: label ‘end’ defined here
test.c:4:7: note: ‘bytes’ declared here

1 ответов


запрещено стандартом:

C99 standard, paragraph 6.8.6.1

Constraints

[...] A goto statement shall not jump from outside the scope of an identifier having a 
      variably modified type to inside the scope of that identifier.

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

вы можете ограничить область bytes окружая его фигурными скобками, поместите выделение перед goto и метка, или не использовать goto на всех.

проще говоря, один раз bytes выделяется, теперь вы находитесь "внутри" области. Перед распределением вы находитесь " снаружи" масштаб. Таким образом, вы не можете "перейти из-за пределов области" в "внутри области".