在这个例子中,如果变量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中对象的生命周期?
全局和文件变量范围之间有什么区别?
答案 0 :(得分:4)
这里有两种static
:static
位于文件的全局范围内,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 scope
但external linkage
。这意味着也可以从其他翻译单元访问这些变量。
string_a是函数内定义的局部变量。如果它是静态的,它将在调用函数后出现,并且一直存在直到程序结束(而非静态局部变量一旦函数结束就停止存在)。
答案 2 :(得分:0)
全局意味着您可以使用extern
关键字在另一个文件中访问该变量。文件范围意味着该变量对其他文件不可见。
在c中,默认情况下,每个全局变量都具有全局范围。如果有人想让全局变量对其他文件不可见,则使用static
关键字定义全局变量。 static
关键字将全局范围转换为文件范围。
答案 3 :(得分:-1)
函数中的静态变量仅限于范围。这意味着这些变量无法从其他函数访问,但与局部变量不同,它在范围之后不会被销毁,并将一直保留到程序结束
全局变量具有文件范围,但可以从其他文件访问这些文件范围
使用了extern
个关键字。文件中的全局范围中的static
将变量仅限于文件。