c中的全局变量和堆变量之间有什么区别和相似之处?

时间:2012-12-26 14:01:14

标签: c global-variables heap

c中的全局变量和堆变量之间有什么区别和相似之处?

假设我有这段代码。

const char* globalVar = "This is a string";

int main(int argc, char* argv[]){
    char* heapVar = malloc(7 * sizeof(char));
}

那么globalVar和heapVar之间有什么区别和相似之处?

提前致谢。

3 个答案:

答案 0 :(得分:2)

全局变量和堆变量是两个不同的概念。堆变量只是告诉您变量的空间分配位置,而全局变量则告诉您变量的范围。

全局意味着变量对任何东西都是可见的,它与本地相对,这意味着变量的可见性受到限制。

堆意味着变量(指针)是动态分配的(例如:使用malloc),并且与不动态分配变量的堆栈相对。

因此,您可以拥有全局堆变量,全局堆栈变量,本地堆变量或本地堆栈变量。

在您的情况下,globalVar是全局的,因为它在任何函数的作用域(大括号)之外声明,而heapVar是main的本地。由于对malloc的调用,在堆上声明了heapVar。 globalVar是一个特例,因为它使用了char *声明。

有关如何处理char *样式声明的更多详细信息,请参阅: Heap or Stack? When a constant string is referred in function call in C++

答案 1 :(得分:0)

全局变量始终存在,它永远不会消失。此外,它在该文件/模块中的所有函数中都可见,除非声明为“静态”,否则它在文件/模块中也是可见的。

请注意,您的全局变量不是“This is a string”,而只是globalVariable,它只是一个指针(包含内存中的地址)。

heapVar变量包含堆上某些内容的地址。该变量仅在main()函数内可见。

可以使全局变量指向堆。

这里的区别在于globalVariable指向的内容是静态分配的,而heapVar指向的内容是动态分配的(你可以通过调用free()和free memory来销毁它,而你不能释放该字符串使用的内存“这是一个字符串“,它是globalVar指向的内容。”

答案 2 :(得分:0)

NB :我在这里谈论globarVar和heapVar,而不是他们指向的内存。
不同之处是:

范围

heapVar在堆栈中,而不在堆中,所以它的范围是它的函数的本地范围,并且globarVar可以在任何地方评估。

生活

当函数调用结束时,heapVar会死,globarVar会在程序的所有持续时间内生效。

关于他们指向的记忆:

heapVar指向的内存位于堆中,而globarVar指向的内存位于实现定义的只读内存中,为了安全起见,使其为const char *:

char* globalVar = "This is a string";

可以随时释放堆中的内存,文字字符串在程序的所有持续时间内都存在。 在你的情况下,你有泄漏。无论如何,我知道这只是一个例子,也许你已经意识到了这一点。