2012-09-22 55 views
2

可能重复:
Is array name a pointer in C?
C++ Static array vs. Dynamic array?C中的静态和动态数组有什么区别?

我学习C和我在不同的是以下两个阵列之间有什么困惑:

int a[10]; 

int *b = (int *) malloc(10 * sizeof(int)); 

只是在最基本的层面上,就是这两者之间的区别?

+0

http://www.cplusplus.com/forum/articles/416/ – jrajav

+0

注意,'的INT A [10];'仅当声明是在文件范围声明一个_static_阵列。 –

+0

@DanielFischer你是什么意思?你是否在说,如果我在函数中有这条线,它不会被称为静态,或者它不会按照我想要的那样做? –

回答

6
int a[10]; 

在栈上分配,并在范围结束后立即解除分配。

int *b = (int *) malloc(10 * sizeof(int)); 

分配上堆,是整个程序的生命周期存活除非它是明确free d。

+0

但如果我声明一下'诠释一个[10]'为全局变量?那么它是否有所作为? –

+0

全局变量在整个程序中都处于活动状态。但是请注意,这不等同于malloc变量。 –

+0

@Zboson'alloca'既不是ISO C也不是POSIX的一部分。除非我没有其他选择,否则我会避免这种功能。 –

1

静态数组会离开当前栈帧尽快销毁(基本上,当你的回报是功能)。动态数组会永远存在,直到你释放()它。

+0

所以如果我这样做:'int a [10]; INT * PTR =&一个;'的方法内,然后返回'ptr'然后'ptr'将指向垃圾返回此方法后? –

+0

@JoeyFranklin不一定是垃圾。它可能仍然指向相同的地址,并且似乎可以工作。但这是一个未定义的行为,这意味着它可能会在某个时候晚些时候崩溃。 –

1

在堆栈上第一生命(=住只要变量的范围),在堆上的第二生命(=住直到释放)。第一个具有固定的大小,而第二个可以重新调整大小。

相关问题