转载

如何在编写C/C++程序的时候利用动态数组节约空间

                 如何在编写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字节的空间,完成后立即释放,留下的只是适合你输入数据
大小的一个堆空间了。

 

正文到此结束
Loading...