假设您知道变量/指针在编译时的值,这之间有什么区别吗?
int x = 5;
main(){
...
}
:
main(){
int *x = (int *) malloc(sizeof(int));
*x = 5;
...
}
我知道后者将内存分配给堆,前者将内存分配给堆栈,但是全局变量将在整个程序运行期间存储,就像存储在堆中的东西一样。那么这两段代码在功能上有什么不同吗?
一个区别是变量的作用域。全局变量可以从程序中的任何函数访问,而main()
中的指针变量只能从该函数访问。要访问它在另一个函数中引用的内存,必须将其作为参数传递给函数(或者将变量的地址放入全局变量中)。
另一个区别是你可以改变指针变量指向的地址。
int *x = malloc(sizeof(int));
*x = 5;
int *y = x;
x = malloc(sizeof(int));
*x = 10; // *y still contains 5
你不能改变全局变量的位置,只能改变它的内容
注意:在下面的所有注释中,我假设代码是为普通的现代台式计算机编译并运行的。
我知道后者将内存分配给堆
True, malloc
从称为堆的内存区域获取内存。
和前者的堆栈
False,全局变量不存储在堆栈中。初始化的全局变量的值存储在可执行文件中。该值是从可执行文件加载到数据段的。
真正,但全局变量将在整个过程中被存储项目
。
和存储在堆中的
False, malloc
获得的内存可以随free
释放。因此,存储在堆中的项可能是临时的。它们不一定"在整个程序期间存储"
从注释中:
相似之处在于,您将有一个可用的变量存储5
False,第一个代码片段中的全局变量在整个程序中可用。第二个代码片段中的指针是main
的局部指针,只有当指针作为参数传递给其他函数时,它才可用于这些函数。例如,下面的代码不能工作(因为foo
没有访问x
的权限)。
void foo( void ) {
printf( "%dn", *x );
}
int main( void ) {
int *x = malloc(sizeof(int));
*x = 5;
}