Ниже код C действителен или нет? - PullRequest
1 голос
/ 06 сентября 2011

Читая пост, я наткнулся на следующий код, и вывод этого кода в соответствии с постом является ошибкой, говорящей:

Элемент массива не может быть адресом автоматической переменной.Это может быть адрес статических или внешних переменных.

 #include<stdio.h>
 int main()
 {
 int a=5,b=10,c=15;
 int *arr[]={&a,&b,&c};
 printf("%d",*arr[1]);
 return 0;
 }

Но когда этот код запускается на MinGW и онлайн-компиляторе, он работает без ошибок.

Поэтому хотелось бы знать, что это совершенно правильно или нет ??

Ответы [ 3 ]

5 голосов
/ 06 сентября 2011

В C99 это нормально, но ANSI - нет.

3 голосов
/ 06 сентября 2011

Это выглядит хорошо для меня.Я не вижу в этом ничего плохого.Если бы мне пришлось придираться, это было бы твоим форматированием и отступом ... Но это как раз об этом.

РЕДАКТИРОВАТЬ: Я думаю, что пост, о котором ты говорил, означал, что ты не можешь вернуть адреслокальной или автоматической переменной.В этом примере все находится в одной области видимости, поэтому все отлично.

РЕДАКТИРОВАТЬ 2: Хорошо, возвращаясь к предыдущему опыту, я думаю, что я могу найти "некоторые" слабости в коде.Я видел это на компиляторе Intel.

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

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

Очевидно, это было то, чего я не должен был делать, но было бы хорошо, если быпеременная не была автоматической.

1 голос
/ 06 сентября 2011

Я думаю, что это сообщение об ошибке является своего рода ошибкой компилятора;это ненужное ограничение.Ссылка на переменные auto (was: local) в массиве действительно опасна, но в этом случае область видимости массива и ссылочных переменных одинаковы (хотя и могут быть «экспортированы» в другие области, скажем, при вызове функции).с массивом, который захватывает некоторые его элементы).Есть несколько способов сделать такую ​​ошибку, даже те, которые не могут обнаружить время компиляции.Да, указатели опасны, но жизнь такова.

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