4

string_a在这个例子中,如果 variable被声明为 variable会有什么不同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

4 回答 4

4

这里有两种static在起作用:static在文件的全局范围内和static在函数内。

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

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

static函数内部意味着对象从第一次调用函数到程序结束都存在。

插图:

int external_linkage;
static int internal_linkage;

void foo()
{
    static int static_in_function;
}

与堆栈和堆变量不同,所有三个变量都保证具有0程序运行时间的值。

于 2013-07-17T11:12:39.783 回答
2

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

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

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

于 2013-07-17T11:10:16.963 回答
0

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

于 2013-07-17T11:05:31.037 回答
-1

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

全局变量具有文件范围,但可以从其他文件访问,也可以使用提供
extern的关键字。static在 File 的全局范围内,仅将变量限制为文件。

于 2013-07-17T11:13:06.243 回答