2013-07-17 2 views
4

В этом примере, какая разница, если переменная string_a объявлена ​​как static переменная?Какова продолжительность жизни объекта?

const char *pString; 
void first(void) 
{ 
    const char string_a[] = " First string "; 
    pString =(char *)string_a; 
} 
void second(void) 
{ 
    const char string_b[] = " Second string "; 
    pString =(char *)string_b; 
} 
int main() 
{ 
    first(); 
    second(); 
    printf("%s\n", pString); 
} 
  • Что определяло жизнь объекта в C?

  • Какова разница между глобальной и файл области видимости переменных?

+1

См. Также http://stackoverflow.com/questions/7632120/scope-vs-life-of-variable-in-c – torek

+6

* «Срок службы объекта» *? Что вы имеете в виду? C не имеет объектов. – m0skit0

+0

Чтобы уточнить m0skit0, этот вопрос неоднозначен, потому что у C нет объектов. Например, когда вы говорите о времени жизни 'string_a', неясно, означает ли вы время жизни самого указателя или время жизни вещи, на которую указывает. Спрашивать смутные вопросы, как правило, вы получаете путаные ответы. –

ответ

4

В игре есть два вида static: static в глобальной области действия в файле и static внутри функции.

Бывший объявляет внутреннюю связь для объекта, что означает, что он доступен только внутри файла. Эти объекты создаются на bss до ввода main(). Эта область памяти всегда memset для всех нулей до main() работает.

Значение по умолчанию для объектов, созданных за пределами области видимости, составляет глобальный (внешняя связь), то есть они могут быть доступны из других единиц компиляции с использованием ключевого слова extern.

Внутри функции означает, что объект существует с момента вызова функции до окончания программы.

Иллюстрация:

int external_linkage; 
static int internal_linkage; 

void foo() 
{ 
    static int static_in_function; 
} 

Все три переменные гарантированно иметь значение 0, когда программа работает, в отличие от стека и кучи переменных.

0

Глобальное означает, что вы можете получить доступ к этой переменной в другом файле, используя ключевое слово extern. Область файла означает, что эта переменная не видна другим файлам. В c По умолчанию каждая глобальная переменная имеет глобальную область видимости. Если кто-то хочет сделать глобальную переменную невидимой для других файлов, они определяют глобальную переменную с ключевым словом static. static ключевое слово преобразует глобальную область видимости в файл.

2

Статические переменные имеют file scope с internal linkage. Это означает, что эти переменные не могут быть доступны из других единиц перевода.

Глобальные переменные также имеют file scope, но с external linkage. Это означает, что к этим переменным можно получить доступ и от других единиц перевода.

string_a - это локальная переменная, определенная внутри функции. Если он сделан как статический, он появится после вызова функции и будет существовать до тех пор, пока программа не закончится (тогда как нестатические локальные переменные перестанут существовать, как только функция завершится).

-1

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

Глобальных переменных имеют объем файла, но те, доступны из других файлов, а также предоставленных
extern ключевого слова используется. static в глобальной области действия в файле ограничивает переменную только файлом.

+2

C действительно имеет что-то, называемое объектами, только что-то отличное от * объекта * в ООП. Объект * в C определяется как область хранения данных в среде исполнения, содержимое которой может представлять значения **. – Lstor

+0

Отредактировал мой ответ. Я не знал. –

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