主题:[讨论]悲伤数组
安泰007
[专家分:30] 发布于 2010-06-29 01:07:00
小弟困惑,请各位大虾帮忙,不甚感激! 问题:通常定义数组时,大小必须是一个确定的正整数,但实际的情况是,在事前若是把数组定义得很大的话,有时就会浪费大量内存;但若是事前定义得小了的话,有时又不够用!请问各位大虾有没有办法在用户使用时,再根据环境自行定义数组大小的方法呢!
回复列表 (共8个回复)
沙发
林杰杰 [专家分:8970] 发布于 2010-06-29 01:26:00
用所谓的申请动态内存
板凳
雪光风剑 [专家分:27190] 发布于 2010-06-29 06:44:00
C的malloc,c++的new
3 楼
强强 [专家分:4740] 发布于 2010-06-29 08:40:00
他还没学到那呢
4 楼
overfly [专家分:3230] 发布于 2010-06-29 10:33:00
标题相当有创意[em2]
5 楼
安泰007 [专家分:30] 发布于 2010-06-29 10:44:00
能否举个实例说明一下呢,小弟还只是个初学.多谢!
6 楼
eastcowboy [专家分:25370] 发布于 2010-06-29 12:26:00
几个办法可以解决您的烦恼。
(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 楼
alweeq86 [专家分:1170] 发布于 2010-06-29 16:01:00
LS第一种方法学习了 以前没有见过这样实现的
8 楼
雪光风剑 [专家分:27190] 发布于 2010-06-30 05:48:00
[quote]LS第一种方法学习了 以前没有见过这样实现的[/quote]
那样的方法是编译器限定的
在一般能用到的linux中,int vlist[argc];是合法的,而TC和VC系列我就没编译成功过
我来回复