如何在编写C/C++程序的时候利用动态数组节约空间
我们知道当编写程序的时候,有时候并不能确定数组的宽度,
如果使用静态数组如:
char test[20]
那么这个数组在编译的时候就分配了相应的空间并且存储在堆栈中,
它为20字节。
我们当然可以使用
fgets(C)或者cin.getline(C++)
进行字符串的录入,但是如果我长期只有个2个字节的数据录入,那么
剩下的17个字节(加上了数组的结束标记/0),那么内存得到了很大的浪费
那么是否可以
char *p 来使用呢?
当然答案是否定的,一个没有初始化的指针,他的指向是不确定的,并且
根本就没有分配过空间,如何能存储数据呢?
我们使用的方法应该是
C:malloc 之类的函数,建立动态存储空间
C++:new 语句建立动态数组
来看列子:
C:
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
char *getic(void);
int main(void)
{
char *p;
p = getic();
printf("%s",p);
free(p);
}
char *getic(void)
{
char inc[20];
char *incn ;
fgets(inc,20,stdin);
incn = (char *)malloc(strlen(inc)+1);
strcpy(incn,inc);
//no free(incn)
return incn;
}
C++:
#include<string.h>
#include<iostream>
using namespace std;
char *getic(void);
int main(void)
{
char *p;
p = getic();
cout<<p<<endl;
delete p;
}
char *getic(void)
{
char inc[20];
cin.getline(inc,20);
char *incn ;
incn= new char[strlen(inc)+1];
strcpy(incn,inc);
//no delete [] incn;
return incn;
}
程序很短,但是足以说明问题,我们知道用malloc或者new建立的存储空间
是存储在堆中的而非展中,栈中的数据空间会随着函数的运行结束而释放
除非使用static,而堆中的数据存储空间除非free()或者delete,那么我们的
main函数可以利用这一点调用到这个指针,最终完成功能。
这样一来我的main函数中不会再有占用大量内存的数组了,有的只是在调用函数
getic期间短暂的需要20字节的空间,完成后立即释放,留下的只是适合你输入数据
大小的一个堆空间了。