C/C++实现动态数组
C语言中,数组长度必须在创建数组时指定,并且只能是一个常数,不能是变量。一旦定义了一个数组,系统将为它分配一个固定大小的空间,以后不能改变,称为静态数组。静态数组存放在:全局变量区、栈。
动态数组,可以随程序需要而重新指定大小。动态数组的内存空间是从堆(heap)上分配(即动态分配)的。步骤如下:
1、malloc/new分配堆内存;注意堆内存的释放;
2、通过指针偏移、下标进行赋值。
首先看C如何实现动态数组。代码如下:
一、使用[]运算符
#include <stdio.h> #include <stdlib.h> int main(){ int arrLen; // 数组长度 int *array; // 数组指针 int i; // 数组下标 printf("输入数组长度:"); scanf("%d", &arrLen); // 动态分配内存空间,如果失败就退出程序 array = (int*)malloc( arrLen*sizeof(int) ); if(!array){ printf("创建数组失败! "); exit(1); } // 向内存中写入数据 for(i=0; i<arrLen; i++){ array[i] = i+1; } // 循环输出数组元素 for(i=0; i<arrLen; i++){ printf("%d ", array[i]); } printf(" "); free(array); system("pause"); return 0; }运行结果:
输入数组长度:10
1 2 3 4 5 6 7 8 9 10
请按任意键继续. . .
二、不使用[]运算符
#include <stdio.h> #include <stdlib.h> int main(){ int arrLen; // 数组长度 int *array; // 数组指针 int *arrayCopy; // 数组指针副本 int i; // 数组下标 printf("输入数组长度:"); scanf("%d", &arrLen); // 动态分配内存空间,如果失败就退出程序 arrayCopy = array = (int*)malloc( arrLen*sizeof(int) ); if(!array){ printf("创建数组失败! "); exit(1); } // 向内存中写入数据 for(i=0; i<arrLen; i++){ *arrayCopy++ = i+1; } // 循环输出数组元素 arrayCopy = array; for(i=0; i<arrLen; i++){ printf("%d ", *arrayCopy++); } printf(" "); free(array); system("pause"); return 0; }可以发现,我们必须另外定义两个指针变量
1、arrayCopy,用来指向具体的数组元素。
2、array:用于指向数组首地址。在数组赋值完成后,要用array将 arrayCopy 重置到数组首地址,以便后面循环输出。
这里注意:free() 函数必须释放整块内存,不能只释放一部分,或者释放不存在的内存空间,否则程序会出错。
C++实现动态数组。
#include<iostream> using namespace std; int main(void) { int n=20; int *p=new int[n]; for(int i=0;i<n;i++) { cout<<&p[i]<<endl; p[i] = i; } for(int i= 0;i<n;i++) { cout<<p[i]<<endl; } delete [] p; system("pause"); return 0; }
注意:
最后重要的是别忘了将动态创造的空间释放掉,语句是:delete [] p; ‘[ ]’表明该指针是指向的自由存储区的数组,而非单个对象。如果遗漏了空方括号,编译器将无法发现这个错误,将导致程序在运行时出错。
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: C++内存分配及变长数组的动态分配
- 下一篇: Link-添加网页图标