假设您在编译时知道变量/指针的值,那么它之间有任何区别:
main(){
int *x = (int *) malloc(sizeof(int));
*x = 5;
...
}
和此:
{{1}}
我知道后者将内存分配给堆,而前者分配堆栈,但是全局变量将在程序的持续时间内存储,存储在堆中的内容也将存储。那么这两段代码之间是否存在功能差异?
答案 0 :(得分:3)
一个区别是变量的范围。可以从程序中的任何函数访问全局变量,而main()
中的指针变量只能从该函数访问。要访问它在另一个函数中引用的内存,必须将其作为参数传递给函数(或者将变量的地址放入全局变量中)。
另一个不同之处在于您可以更改指针变量指向的地址。
int *x = malloc(sizeof(int));
*x = 5;
int *y = x;
x = malloc(sizeof(int));
*x = 10; // *y still contains 5
您无法更改全局变量的位置,只能更改其内容。
答案 1 :(得分:2)
注意:在下面的所有评论中,我假设代码是在普通的日常普通现代台式计算机上编译和运行的。
我知道后者为堆分配内存
True ,malloc
从称为堆的内存区域获取内存。
前者是堆栈
错误,全局变量不存储在堆栈中。初始化的全局变量将其值存储在可执行文件中。该值从可执行文件加载到data segment。
但是全局变量将在整个持续时间内存储 程序
<强>真强>
存储在堆中的东西
错误,从malloc
获取的内存可以与free
一起发布。因此,存储在堆中的项可能是临时的。它们不一定“在整个程序期间存储”
来自评论:
相似之处在于你有一个变量存储5可用 在全球范围内完成该计划。
错误,整个程序中第一个代码段中的全局变量可用。第二个片段中的指针是main
的本地指针,仅当指针作为参数传递给这些函数时才可用于其他函数。例如,以下内容无效(因为foo
无法访问x
)。
void foo( void ) {
printf( "%d\n", *x );
}
int main( void ) {
int *x = malloc(sizeof(int));
*x = 5;
}