c中的全局变量和堆变量之间有什么区别和相似之处?
假设我有这段代码。
const char* globalVar = "This is a string";
int main(int argc, char* argv[]){
char* heapVar = malloc(7 * sizeof(char));
}
那么globalVar和heapVar之间有什么区别和相似之处?
提前致谢。
答案 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";
可以随时释放堆中的内存,文字字符串在程序的所有持续时间内都存在。 在你的情况下,你有泄漏。无论如何,我知道这只是一个例子,也许你已经意识到了这一点。