回 帖 发 新 帖 刷新版面

主题:[讨论]悲伤数组

小弟困惑,请各位大虾帮忙,不甚感激! 问题:通常定义数组时,大小必须是一个确定的正整数,但实际的情况是,在事前若是把数组定义得很大的话,有时就会浪费大量内存;但若是事前定义得小了的话,有时又不够用!请问各位大虾有没有办法在用户使用时,再根据环境自行定义数组大小的方法呢!

回复列表 (共8个回复)

沙发

用所谓的申请动态内存

板凳

C的malloc,c++的new

3 楼

他还没学到那呢

4 楼


标题相当有创意[em2]

5 楼


能否举个实例说明一下呢,小弟还只是个初学.多谢!

6 楼

几个办法可以解决您的烦恼。

(1) 根据99年制定的C语言标准,数组的大小不必是“在编译时就能确定的数字”,可以在运行的时候去确定。遗憾的是有两点:第一,虽然时隔十年,但Visual C++系列一直都没有支持这样的功能;第二,虽然C语言标准有这样的规定,但C++的正式标准却没有规定(至少目前没有)。
您可以使用GCC或者Intel C++ Compiler,以便使用这个功能。提示:可能需要修改一下编译器选项,比如Intel C++ Compiler,我用的是10.0,默认是不支持C99的,但可以选择让它支持。(说明:GCC是一个著名的、免费的编译器,拥有较高的人气;Intel C++ Compiler是Intel公司的C/C++编译器,价格高昂,但能力也很优秀,据说专门为Intel公司的CPU做了不少优化处理,安装后可以与Visual C++集成,在Visual Studio中选择使用Visual C++自带的编译器,或者使用Intel C++编译器)
测试代码如下:
    int i, n;
    scanf("%d", &n); // 让用户输入n
    if (n <= 0) {
        exit(-1); // 如果输入的数并非正整数,则不可能创建数组
    }

    {
        int a[n]; // 建立一个名为a的数组,其大小为n。注意n是在运行时才能确定的值
        for (i = 0; i < n; ++i) {
            a[i] = 0;
        }
    }



(2) 如果您使用的是C++语言,而不是C语言,虽然不能用上面那个办法了,不过可以用std::vector,这个甚至比上面那个更好用。
    int n;
    scanf("%d", &n); // 让用户输入n
    if (n <= 0) {
        exit(-1); // 如果输入的数并非正整数,则不可能创建数组
    }

    {
        std::vector<int> a(n);
        for (i = 0; i < n; ++i) {
            a[i] = 0;  // std::vector<int>同样可以使用中括号,看起来就像是数组一样
        }

        a.resize(1000); // 可以用resize改变大小!数组的大小是无法改变的,但这个则可以

        for (i = 0; i < 1000; ++i) {
            a[i] = 0;
        }
    }



(3) 如果使用的是C语言,并且又无法用第(1)种办法,那我们还可以自己申请内存。
    int i, n;
    scanf("%d", &n); // 让用户输入n
    if (n <= 0) {
        exit(-1); // 如果输入的数并非正整数,则不可能创建数组
    }

    {
        int* a = malloc(n * sizeof(int)); // 申请一块空间,其大小为n个int的大小
                                          // 如果是C++,应该写为:
                                          // int* a = (int*)malloc(n * sizeof(int));

        if (a == NULL) {
            exit(-1); // 如果申请失败,说明内存不足,结束程序
        }

        for (i = 0; i < n; ++i) {
            a[i] = 0; // 像数组一样的操作
        }

        a = realloc(a, 1000 * sizeof(int)); // 可以改变大小,让分配的空间变为1000个int的大小
                                            // 数组的大小是无法改变的,但这个则可以
                                            // 如果是C++,应该写为:
                                            // a = (int*)realloc(a, 1000 * sizeof(int));

        for (i = 0; i < 1000; ++i) {
            a[i] = 0;
        }

        free(a);                            // 申请的内存空间如果不再使用,要记得释放
    }



第三种方法是不得已而为之,因为如果不够小心,申请的内存忘记了释放,就会造成申请的内存越来越多,让电脑不堪重负。如果可以用前面两种办法解决的话,就不要用第三种了。

7 楼

LS第一种方法学习了  以前没有见过这样实现的

8 楼

[quote]LS第一种方法学习了  以前没有见过这样实现的[/quote]
那样的方法是编译器限定的
在一般能用到的linux中,int vlist[argc];是合法的,而TC和VC系列我就没编译成功过

我来回复

您尚未登录,请登录后再回复。点此登录或注册