什么是对象的生命周期?

时间:2013-07-17 11:02:38

标签: c

在这个例子中,如果变量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中对象的生命周期?

  • 全局文件变量范围之间有什么区别?

4 个答案:

答案 0 :(得分:4)

这里有两种staticstatic位于文件的全局范围内,static位于函数内。

前者声明对象的内部链接,这意味着它只能在文件中访问。在输入main()之前,会在bss上创建这些对象。 <{1}}运行之前,该内存区域始终为memset全部为零。

在函数范围之外创建的对象的默认值是 global (外部链接),这意味着可以使用main()关键字从其他编译单元访问它们。

函数内部的

extern表示该对象从第一次调用函数到程序结束时都存在。

插图:

static

当程序运行时,所有三个变量保证的值为int external_linkage; static int internal_linkage; void foo() { static int static_in_function; } ,与堆栈和堆变量不同。

答案 1 :(得分:2)

静态变量file scope internal linkage。这意味着无法从其他翻译单元访问这些变量。

全局变量也有file scopeexternal linkage。这意味着也可以从其他翻译单元访问这些变量。

string_a是函数内定义的局部变量。如果它是静态的,它将在调用函数后出现,并且一直存在直到程序结束(而非静态局部变量一旦函数结束就停止存在)。

答案 2 :(得分:0)

全局意味着您可以使用extern关键字在另一个文件中访问该变量。文件范围意味着该变量对其他文件不可见。 在c中,默认情况下,每个全局变量都具有全局范围。如果有人想让全局变量对其他文件不可见,则使用static关键字定义全局变量。 static关键字将全局范围转换为文件范围。

答案 3 :(得分:-1)

函数中的静态变量仅限于范围。这意味着这些变量无法从其他函数访问,但与局部变量不同,它在范围之后不会被销毁,并将一直保留到程序结束

全局变量具有文件范围,但可以从其他文件访问这些文件范围 使用了extern个关键字。文件中的全局范围中的static将变量仅限于文件。