静态数组与C ++中的dynamic数组

C ++中的静态数组和dynamic数组有什么区别?

我必须为我的课做一个任务,它说不使用静态数组,只有dynamic数组。 我已经看了书和网上,但我似乎不明白。

我认为静态是在编译时创build的,在运行时是dynamic的,但我可能会误认为是内存分配。

你能解释在C + +的静态数组和dynamic数组之间的区别吗?

本地数组在堆栈上创build,并具有自动存储持续时间 – 您不需要手动pipe理内存,但是当它们所在的函数结束时它们将被销毁。 他们必须有一个固定的大小:

int foo[10]; 

使用operator new[]创build的数组具有dynamic存储持续时间,并存储在堆(技术上称为“免费存储”)中。 他们可以有任何大小,但你需要自己分配和释放他们,因为他们不是堆栈框架的一部分:

 int* foo = new int[10]; delete[] foo; 

静态是C和C ++中的一个关键字,所以静态在应用于variables或数组时,具有非常具体的含义,而不是一般的描述性术语。 为了增加混淆,它在不同的情况下有三个不同的含义。 正因为如此,静态数组可能是固定的或dynamic的。

让我解释:

首先是C ++特定的:

  • 静态类成员是一个没有用构造函数实例化或用析构函数删除的值。 这意味着成员必须被初始化和维护。 静态成员可能是指针初始化为空,然后在第一次调用构造函数时分配。 (是的,这将是静态和dynamic的)

两个是从Cinheritance的:

  • 在一个函数中,一个静态variables是一个在函数调用之间保留了内存位置的variables。 它是静态的,它只被初始化一次,并在函数调用之间保留它的值(使用静态函数使函数不可重入,即不是线程安全)

  • 在函数之外声明的静态variables是全局variables,只能从同一个模块中访问(与任何其他#include一起使用的源代码文件)

你想问的问题(我认为)是dynamic数组和固定或编译时间数组之间的区别。 这是一个更容易的问题,编译时数组是事先确定的(当程序编译时)并且是函数栈帧的一部分。 在主函数运行之前分配它们。 dynamic数组是在运行时用“new”关键字(或C中的malloc系列)分配的,并且它们的大小事先是未知的。 dynamic分配不会自动清除,直到程序停止运行。

我认为在你的课堂上使用的语义是混乱的。 “静态”可能意味着“恒定大小”,而“dynamic”可能意味着“可变大小”。 那样的话,一个恒定大小的数组可能看起来像这样:

 int x[10]; 

而“dynamic”则可以是任何一种允许底层存储在运行时增加或减less的结构。 大多数情况下,C ++标准库中的std::vector类就足够了。 像这样使用它:

 std::vector<int> x(10); // this starts with 10 elements, but the vector can be resized. 

std::vector定义了operator[] ,所以可以使用与数组相同的语义。

静态数组在编译时分配内存,内存分配在堆栈上。 而dynamic数组在运行时分配内存,内存则从堆中分配。

 int arr[] = { 1, 3, 4 }; // static integer array. int* arr = new int[3]; // dynamic integer array. 

我认为在这种情况下,这意味着它是静态的,因为大小是固定的。 使用std :: vector。 它有一个resize()函数。

对术语的含义有明确的定义是很重要的。 不幸的是,似乎有多个静态和dynamic数组的定义。

静态variables是使用静态内存分配定义的variables。 这是一个独立于C / C ++的通用概念。 在C / C ++中,我们可以像这样创build具有全局,文件或局部范围的静态variables:

 int x[10]; //static array with global scope static int y[10]; //static array with file scope foo() { static int z[10]; //static array with local scope 

自动variables通常使用基于堆栈的内存分配来实现。 自动数组可以像这样在C / C ++中创build:

 foo() { int w[10]; //automatic array 

这些数组, x, y, zw有什么共同之处,就是每个数组的大小是固定的,并且是在编译时定义的。

理解自动数组和静态数组之间的区别很重要的原因之一是,静态存储通常在对象文件的数据部分 (或BSS部分 )中实现,编译器可以使用绝对地址访问数组这对于基于堆栈的存储是不可能的。

dynamic数组通常意味着不是可resize的,而是使用在运行时确定的具有固定大小的dynamic内存分配来实现的。 在C ++中,这是使用new运算符完成的。

 foo() { int *d = new int[n]; //dynamically allocated array with size n 

但是可以使用alloca创build一个在运行时定义的修复大小的自动数组:

 foo() { int *s = (int*)alloca(n*sizeof(int)) 

对于一个真正的dynamic数组,应该使用类似于C ++中的std::vector (或者C中的一个可变长度数组 )。

OP的问题中的任务是什么意思? 我想很明显,想要的不是静态或自动数组,而是使用new运算符dynamic内存分配或使用例如std::vector的非固定大小数组。

是的,这个静态数组是在编译时创build的,因为dynamic数组是在运行时创build的。 到目前为止,与其存储位置有关的差异是静态位于堆栈上,而dynamic是在堆上创build的。 在堆上的所有东西都需要内存pipe理,除非存在.net框架的垃圾收集器,否则存在内存泄漏的风险。

静态数组:效率。 不需要dynamic分配或取消分配。

在C,C ++中声明的包含静态修饰符的函数是静态的。 例如:static int foo [5];

你可以有一个伪dynamic数组,其大小是由用户在运行时设置的,但之后会被修复。

 int size; cin >> size; int dynamicArray[size]; 

在arrays中放置元素的静态的东西

dynamic的文字,而不会给arrays中的元素

例:

  char a[10]; //static array char a[]; //dynamic array