2 studying2 studying2 于 2016.09.11 21:05 提问

c++数组内存自动分配的问题

c++数组内存自动分配具体有哪些作用?
它可以随程序运行而扩大分配空间吗?

6个回答

hijack00
hijack00   Rxr 2016.09.11 21:34
已采纳

用new关键字申请的内存空间没有这种功能。
若使用STL中的容器(例如vector, list等等)可以自动管理存储空间,随着程序的运行,其分配空间会动态变化

zhongxiashuhan
zhongxiashuhan   2016.09.11 21:23

通俗点来说,动态数组主要适用于有些在运行期间才能确定内存大小的情况下,固定空间的数组适用于那些我们能编译期间就能确定大小的情况。

u011514451
u011514451   2016.09.12 11:17

STL里的容器会先分配一定量的内存,当不够时会重新分配之前内存x2的大小的内存容量,以此类推。如刚开始分配了32,不够时会重分64、128、256...

magengjie
magengjie   2016.09.20 16:17

#include "DynamicArray.h"

//初始化数组
DynamicArray Init_DynamicArray(){

DArray* darray = malloc(sizeof(DArray));
if (darray == NULL){
    return NULL;
}
darray->capacity = 5; //初始化容量5
darray->size = 0;
darray->address = (void**)malloc(sizeof(void*) * darray->capacity);

return darray;

}
//指定位置插入
void Insert_DynamicArray(DynamicArray darray, int pos, void* data){
if (darray == NULL){
return;
}
if (data == NULL){
return;
}
DArray* arr = (DArray*)darray;
//判断空间是否足够
if (arr->size == arr->capacity){

    int newcapacity = arr->capacity * 2; //两倍空间扩展
    //申请空间
    void** newspace = (void**)malloc(sizeof(void*) * newcapacity);
    //拷贝原空间数据到新空间
    memcpy(newspace,arr->address,sizeof(void*) * arr->capacity);
    //释放旧空间
    free(arr->address);
    arr->address = newspace;
    arr->capacity = newcapacity;

}

//判断位置是否有效,如果pos越界,调整为在尾部插入
if (pos < 0 || pos > arr->size){
    pos = arr->size;
}
//移动元素
int i = arr->size - 1;
for (; i >= pos;i--){
    arr->address[i + 1] = arr->address[i];
}
arr->address[pos] = data;
arr->size++;

}

wzxq123
wzxq123   Rxr 2016.09.11 21:38

普通的数组是不能动态扩大内存的,但是可以用STL里面的相关容器。

qq_33220449
qq_33220449   2016.09.12 09:18

学习了,这个我也刚好不懂。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
C语言中内存地址是如何分配的
今天在练习链表的实现,在基于数组的链表中,我的插入函数中的“搬家”代码是这样写的: p = &l->elem[l->length-1]; q=&l->elem[i-1]; for(;p>q; p--){ *(p) = *(p-1); } 后来发现总是把第一个数据被挤出去,经过仔细检查,发现修改成这样是正确的! p=&(l->elem[l->length-1]); q = &l-
C语言中自动变量栈的分配
大家都知道在c语言的运行过程中,局部变量都是存放在栈中的,且是从高位到低位进行进行空间分配。先看一个程序。很明显,地址从高到低分配,和预计的一样。稍微修改一下,再运行。很明显,从低位到高位!!!明确一下问题:栈区会应为局部变量的占内存的大小更改内存的分配方式。为什么?为什么?为什么?用-S生成汇编语言看一下第一种情况的汇编语言 .file "main.c" .section .rodata .L
简述C语言动态、静态内存分配
#include #include /** c语言静态内存分配 */ void func(int** address ) { //定义int类型的i变量,并赋值100 int i = 100; //把i对应的地址赋值给iPoint变量 *address = &i; } int main(int argc, char *argv[]) { //定义int类型的一级指针变量iPoin
c语言中数组的内存建立
使用C语言编程,实际上使用的内存只有一种——虚拟内存。根据功能的不同在C语言中又将虚拟内存为分三类:栈区、堆区、静态数据区,无论单一变量还是数组,其内存分配都是如此。其中,栈区、静态数据区、堆区都会有编译器负责分配、操作系统负责管理,程序员可以在堆区使用malloc()来动态分配堆内存。 1、栈区:一般每一个函数对应一个栈区,在编译原理中称为栈帧。比如下面的代码: int main() {
c中定义变量的内存分配顺序问题(极易错!!!)
对于c语言中大家都知道所有的变量都必须是先定义后使用的,但是但是,对于好多人而言,基本上没有人来注意自己的编译器和操作系统对这个东西是如何处理的, 1,如果全是一样的类型,比如全是int,编译器会如何分配呢??是从大到小还是从小到大,, 2,如果是基本的混合类型呢, 它又是先给那个分配呢,是不管呢??还是考虑一下呢?? 3, 数组的分配方式和基本类型一样吗??编译器又是如何处理的??如果是混
C数组与java数组在内存中的区别
C数组:静态数组,数组一旦被定义后,占用的内存空间就是固定的,不能改变数组长度。 C有两个版本,C89和C99 在C89中,必须使用数值常量指明数组的长度,不能使用变量(不管变量有没有被初始化); 在C99中,可以使用变量指明数组的长度,但它仍是静态数组,一旦确定长度后,长度就不能改变了。
在C++中为数组动态分配内存
在C++中为数组动态分配内存的格式如下:   第一步:声明        type (p)[常量1][常量2]...[常量n]; 第二步:申请        p=new type[x][常量1][常量2]...[常量n]; 说明:先定义一个n维的数组指针,其中p是一个指针变量,x是一个整形变量,       然后申请一个第一维为x的n+1维数组,记住只有第一维x可变。 举例
数组内存申请和释放,指针数组和数组指针
一 数组指针的空间释放 1 2 3 4 int (*p)[3] = new int [4][3]; // ... delete []p;    //---1 delete[](*p);  //---2 在释放这个二维数组时,应该使用1和2哪种方式呢?哪种对呢?
数组:静态分配连续内存空间
1、用数组静态获得一段连续的存储空间,大小当然有限制了。 理论上来说没有限制,但是内核一般配置允许每个进程拥有有限的内存空间,可以用系统调用函数getrlimit(int resource, struct rlimit *rlim)获得系统的资源限制。系统的资源限制分为软件限制和硬件限制,软件限制最大值不能超过硬件限制。数组静态获得的存储空间是分配在stack,只要知道stack的限制就知道答案
C/C++自动分配和回收内存
根据生命周期结束后可以自动释放内存.严格来说是可以说半自动回收,个人原编,希望对大家有用,反正我是用的挺爽,创建内存方面,内存回收也干净.