2016-10-20 3 views
1

То, что я считал статическим указателем, как и другие статические переменные, которые инициализируются значением, которое имеет одно и то же значение до конца, подобно тому, что тот же адрес будет храниться в статическом указателе. Но в этом случае компилятор выбрасывает ошибкуСтатический указатель, инициализатор не является постоянным?

//initialiser element is not constant  static int *a = &b[0]; 

#include <stdio.h> 
int main(void) 
{ 
    int b[2]; 

    static int *a = &b[0]; // removing static the program works well. 
    printf("%u",a); 

    a = &b[1]; 
    printf("%u",a); 

    return 0; 
} 

Так что же такое использование статического указателя?

+0

Предполагается, что это C или C++? Они разные языки, выберите ** один **! – Olaf

+0

@Olaf: Этот вопрос интересен с набором тегов C и C++: ответ очень отличается. – Bathsheba

+0

@ Батшеба: Вот почему он должен иметь только один язык! В противном случае это было бы слишком широко. Но его можно задать дважды, один раз для каждого языка. – Olaf

ответ

3

У вас есть два варианта. Добавьте статику в int b[2] или удалите ее с int *a. Адрес b не является статическим. Это переменная, потому что b - это переменная с автоматическим хранилищем.

+0

Что такое статический указатель, это только для статических переменных? –

+0

@aswinmythili: сообщение об ошибке очень ясно. Любая статическая переменная, включающая глобальные переменные, должна иметь постоянное выражение в качестве инициализатора. Становится понятным, почему, если вы поняли, что такое статические ворсы. – Olaf

4

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

Но, и это интересно немного, в C++ это должен смысл, так как вы не можете называть себя main: поведение на ваш делать так неопределенными. Таким образом, вывод состоит в том, что компилятор должен знать, что static действителен на всю жизнь main и скомпилировать код! Возможно, что-то есть в стандарте C++, который явно запрещает это.

В C вы можете вызывать main рекурсивно (даже неявно рекурсивно), поэтому компилятор должен испускать ошибку.

+0

Что такое статический указатель, это только для статических переменных ?, Учтите, что я не называю main рекурсивно. –

+1

Указатель с длительностью хранения 'static' будет инициализирован один раз. В этом контексте было бы действительно иметь смысл, если бы оно указывало на переменную с длительностью хранения 'static'. – Bathsheba

+0

Я не согласен с разделом «должен». Это будет особый режим для автоматической переменной. Также инициализируется статическая переменная _before_ 'main', адрес любой автоматической переменной не известен во время компиляции. – Olaf

0

Может возникнуть путаница в отношении static против const.

Const переменные будут держать одинаковое значение от времени они инициализируются, пока они не выходят за рамки, если const_cast<> не используется, хотя, как @Bathsheba упоминалось в комментариях, использование const_cast<> на переменную, объявленную сопзЬ не определено.

Статический означает, что он будет инициализирован в месте первого попадания, но затем не выходит за пределы области действия до конца выполнения программы.

+1

Речь идет о C, а не C++. – PSkocik

+0

Это было бы плохо, извините. Я думал, что этот вопрос был найден, наблюдая за тегом C++. (Похоже, у пользователя был C++, а затем C после) –

+1

Обратите внимание, что поведение при попытке изменить varaible, которое изначально было определено как const с помощью const_cast, не определено. – Bathsheba

Смежные вопросы