4

我刚刚阅读了关于我现在在 stackoverflow 中询问的同一主题的所有搜索结果,但这并没有真正回答我的好奇心。但这就是问题所在。

问题

1.)据我所知,静态绑定意味着它是在编译时设置的,并且在运行时存在,而动态绑定意味着它是在运行时设置的。

2.)所以我读的书介绍了动态数组,它提到可以在运行时设置动态数组大小。以这种方式完成。

编码

int size;
cin >> size;
int * pz = new int [size]; // dynamic binding, size set at run time
delete [] pz; // free memory when finished


3.)在这段代码中,书中提到动态数组大小可以在运行时设置。所以出于好奇,我试试这个。

编码

int size;
cin >> size;
int array[size];
//After the array declaraction i assign value to it to check whether it works or not.


4.)上面的代码也有效,所以我只是好奇动态数组有什么特别之处,因为普通的静态数组可以做同样的工作。

5.)是因为动态数组可以在运行时释放它的内存,而静态不能这就是它如此特别的原因吗?


感谢您花时间阅读我的问题,请指出我犯的任何错误。

4

3 回答 3

6

您的具有动态大小的静态数组(称为可变长度数组,简称 VLA)只能在编译器中的语言扩展下工作。这是 C99 的东西,不包含在 C++ 标准中,这意味着它不能移植。

另一个明显的区别是,您可以将指向动态数组的指针传递到其他地方,将其保存在某个地方,从函数中返回它,或者换句话说,让它在它创建的范围内存活。您不能使用静态数组来做到这一点,因为它们在其作用域结束时被销毁。

于 2011-11-21T02:44:42.113 回答
2
int size;
int array[size];

将抛出编译时失败,说size 不是编译时常量或预期的常量表达式

你声明这样的数组

int array[5]

或者

const int size = 100;
int array[size];

当您提前知道数组大小时。

否则,您将使用newdelete []方法。我建议完全避免这种结构,以支持std::vector

于 2011-11-21T02:39:58.797 回答
1

早期绑定:-在翻译过程中进行大部分绑定的语言,在程序处理的早期被称为具有早期绑定。
后期绑定:-具有后期绑定的语言将大多数绑定延迟到 l 执行时间。

早期绑定:-不太灵活。
后期绑定: -它具有更多的编程灵活性。

早期绑定:-在此数据中仅在声明数据类型中接受
后期绑定:-在此变量中可以接受任何类型的数据。

早期绑定:-检测到正确的分配类型。
后期绑定:-在这种不正确类型的赋值右侧没有检测到或错误。

早期绑定:-类型检查必须在编译时完成。
后期绑定:-类型检查必须在运行时进行。

early binding:- It user compiler or interpreter.
Late binding:- Language that have late binding for variable are usually implemented using pure interpreter rather than compiler.

于 2012-10-05T00:22:52.317 回答