当前位置:首页 » 编程语言 » c语言大数组

c语言大数组

发布时间: 2023-01-17 13:44:31

c语言如何实现一个大数组

使用malloc分配啊,普通数组是定义在栈中的,大小受限制的。

⑵ c语言数组的大小

若有说明:int a[][3]={1,2,3,4,5,6,7};则数组a第一维的大小是3。

int a[][]:第一个中括号表示有此二维数组有几行,第二个表示有几列。

故int a[][3]={1,2,3,4,5,6,7};说明此数组有n行,3列;也就是说每行有三个元素,所以第一行有1,2,3 这三个元素,第二行有4,5,6三个元素,第三行有7这个元素,不足的两个元素由0来补足。

对数组进行初始化,要么两个维度都不写,由赋值的数组确定,或者第二维可以不写,第一维要写,再由赋值数组确定。

数组中的下标是从 0 开始的(而不是 1)。那么,如何通过下标表示每个数组元素的呢?通过“数组名[下标]”的方式。例如“int a[5];”表示定义了有 5 个元素的数组 a,这 5 个元素分别为 a[0]、a[1]、a[2]、a[3]、a[4]。其中 a[0]、a[1]、a[2]、a[3]、a[4] 分别表示这 5 个元素的变量名。

如果从 1 开始,那么数组的第 5 个元素就是 a[5],而定义数组时是 int a[5],两个都是 a[5] 就容易产生混淆。而下标从 0 开始就不存在这个问题了!所以定义一个数组 a[n],那么这个数组中元素最大的下标是 n–1;而元素 a[i] 表示数组 a 中第 i+1 个元素。

另外,方括号中的常量表达式可以是“数字常量表达式”,也可以是“符号常量表达式”。但不管是什么表达式,必须是常量,绝对不能是变量。

C 语言不允许对数组的长度进行动态定义,换句话说,数组的大小不依赖程序运行过程中变量的值。非通常的情况为动态内存分配,此种情况下数组的长度就可以动态定义。

(2)c语言大数组扩展阅读:

数组特点

1、数组是相同数据类型的元素的集合。

2、数组中的各元素的存储是有先后顺序的,它们在内存中按照这个先后顺序连续存放在一起。

3、数组元素用整个数组的名字和它自己在数组中的顺序位置来表示。例如,a[0]表示名字为a的数组中的第一个元素,a[1]代表数组a的第二个元素,以此类推。

⑶ C语言中使用大数组


ma——a的最大容量,必须大于na

n=12——求n的阶
p——求阶乘时的当前乘数
*/
#include<stdio.h>
#define Ma 10000
int pa;/*指向数组a的有效末端*/
int p=2;
int memory_over=0;
union data
{ unsigned long int b;
struct
{unsigned l:16;
unsigned h:16;
}m;
}a[Ma];
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
算法说明1:考虑到result比较长,我用a[Ma].b来存储n!的result,每一位a[pa].b能存储4位10进制数字。
因为我定义的数组是静态的,所以Ma应该足够大。
ps:其实只用定义一个unsigned long int b[Ma];就可以了(直接用b[pa]代替a[pa].b),但是我考虑到可能会访问每一结点b[pa]的高16位(a[pa].m.h)和低16位(a[pa].m.l),但是的我考虑是多余的!!不用像我这样定义这么复杂的共用体!!
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
unsigned int cashe;
unsigned int carry;

void main()
{
unsigned int n;/*求n的阶*/
void facto(unsigned int n);
printf("Input n:");
scanf("%u",&n);
/*=================开始求阶乘!=============*/
a[0].b=1;/*初始化*/
facto(n);
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
算法说明2:上面这句直接调用facto(n)来求n!
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*========================以下是显示最后结果====================================*/
if(memory_over==0)
{printf("the result include %dNO:\n",pa+1);
printf("%u",a[pa--].m.l);
for(;pa>=0;pa--)
printf("%04u",a[pa].m.l);
printf("\n");
}
getch();
}

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
算法说明2:求阶函数facto(n)说明:
这个函数会不断地调用multiple(),它的作用是每被调用一次就使得a[pa].b与阶数p相乘一次,直到乘完n为止!
{multiple();
p++;/*每一轮乘一个阶数p*/
}
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
void facto(unsigned int n)
{void multiple();
pa=0;
while(pa<Ma-1&&p<=n)/*容量限制*/
{multiple();
p++;/*每一轮乘一个阶数p*/
}
if(p<=n)
/*如果当前的存储结果的数组a[Ma]不够用!应提高Ma*/

}

/*==============================================================================
算法说明3:乘法函数multiple()说明:负责a[pa].b与阶数p相乘。
a[pa].b有很多结点,a[0].b、a[1].b、a[2].b、a[3].b、a[4].b、。。。
当然是从低结点a[0].b开始不断与p相乘,产生的“进位”加到高位a[1].b,直到a[pa].b*p为止!

随着结果数值增大,pa个结点的a[].b可能容纳不下结果,所以如果a[pa].b与p相乘后还有“进位”carry,就扩大pa,并把carry放入到新增加的结点:
if(carry>0)
a[++pa].b=carry;
===================================================================================*/
void multiple()
{int i=0;
carry=0;
while(i<=pa)/*i指向当前处理的元素a[i],每一轮用一个位与阶数p相乘*/
{a[i].b=a[i].b*p+carry;/*计算结果,要考虑来自低位的进位*/
carry=a[i].b/10000;/*计算进位*/
a[i].b=a[i].b%10000;/*计算余数*/
i++;
}
if(carry>0)
a[++pa].b=carry;
}

⑷ 怎么用C语言定义一个无限长的数组

C语言支持定义一个不显式定义长度的数组,即通过初始化数据来分配数组长度。

比如int a[] = {1,2,3,4,5}; 数组a的长度没有显式给出,由于有5个初始化数据,所以分配空间长度为5个int型。

但是无论如何定义,数组的长度都是固定的,在定义的时候就已经分配好空间,从这个角度上C语言无法定义无限长的数组。但很多实际应用中又事先无法确定数组的长度,对于这类情况,一般有两种方法可以使用。


1 由malloc和realloc两个函数,分配动态空间,随时按需改变数组的最大长度。

通过下面例子来理解该方法:

#include<stdio.h>
#include<stdlib.h>

intmain()
{
intsize=100;//最初为100个元素空间。
int*a=NULL;
inti=0;

a=malloc(sizeof(int)*size);
if(a==NULL)return-1;
while(scanf("%d",a+i)==1)//循环向a中输入数据,直到输入非数值字符为止
{
i++;
if(i==size)//数组空间不足
{
size*=2;//将数组空间扩大二倍,也可以改用size+=100;之类的操作,使size每次增加固定值。
a=realloc(a,size);//分配新的空间
if(a==NULL)
{
return-1;//这种情况下运行载体(如PC)内存不足以提供,中断程序。
}
}
}

if(a)free(a);//对申请的内存进行释放。
return0;
}

从以上程序可以看到,这种方式的原理就是每当数组空间不足时,利用函数realloc分配一段新的内存空间以增大数组长度。 直到占满所有剩余空间。

如果到占满所有空间还是无法存下数据,那么是硬件无法支持了。

所以这种方法可以做到软件意义上的无限大数组空间。


但是这种方法代码量比较大,而且需要频繁的进行内存的分配,如果实现知道数据的最大可能规模,那么可以用另一个方法。


2 事先知道数据的最大规模,比如统计一个班的分数时,一个班最多不超过百人,那么可以直接定义一个长度为100的数组,或者保险起见,定义一个长度为1000的数组,并对其操作。这样在操作范围内,这个就是一个“无限长”的数组了。

⑸ c语言如何定义超过50万的大数组

由于栈大小的限制,这种规模的数组不能存在栈上,所以必须放在堆中。C语言中申请堆空间使用函数malloc:

#include<stdlib.h>

int*arr;

arr=malloc(sizeof(int)*500000);
if(arr==NULL)
空间申请失败;

注意要引用头文件stdlib.h

⑹ 请问C语言中大数组如何处理

你仔细看看这些数据都是有规律的,有相当大的一部分都是0 1 2 3 4 5 6 13重复了很多次。统计一下这些循环出现了多少次,如果考虑这个因素,压缩还是可以的。
否则的话,所有的数据都是0-15区间的整数,即使考虑使用4位二进制压缩,1个字节(8 bit)可以存2个整数,41502个数也需要20K byte,已经超过内存上限了...
如果数据没有规律,而且实在要压缩的话,考虑用霍夫曼编码可能好一些,不过我估计也挺悬的。可以考虑其他方式,不要保存在内存中,程序运行时需要哪一部分数据再读进来。

⑺ C语言:大数组怎么用,做题目的时候碰到一些需要大叔组,但是却编译不通过,怎么办

大数组,如果你想用的话,可以直接用现成的STL容器,比如说vector,map什么的,本身就帮你做好了很多的优化。你可以尝试一下

⑻ c语言 数组太大

1000*(1000*30),三千万的数组,定义了好几个,真心不懂为何要这么大的数组?

⑼ c语言如何给一个大数组赋初值

有3种方法。
1.
将数据保存到文件中,再直接从文件读取。
2.
因为是二维字符数组,可以直接用字符串赋值,如:
char strs[2][11]=
{
"123456",
"asd"
};
3.
将所有数据定义成宏,再赋值,如:
#define data { \
{'a','b','c'}, \
{'a','1',b','c','5'} \
}
char str[2][11]=data;

⑽ c语言数组最大长度

理论上,c语言数组最大的大小没有限制,因为它用的是 虚拟存储。
对于写程序而言,例如要写下标,那么受 unsigned int 最大值的限制,只能用到十六进制 0xffffffff, 十进制4G多一点。
具体程序能获取多大,就很难说,有时编译可以通过,运行时出错。你也可以用 malloc 动态分配请求,看分配是否成功或失败。
对一般程序而言,数组长度通常够用了。

热点内容
淘宝密码忘记了怎么改 发布:2025-07-16 18:47:34 浏览:12
乐视1s锁屏密码是12的有多少 发布:2025-07-16 18:45:12 浏览:98
战队宣传片拍摄脚本 发布:2025-07-16 18:42:23 浏览:462
疫情源码 发布:2025-07-16 18:34:53 浏览:794
安卓开发平台怎么样 发布:2025-07-16 18:30:35 浏览:345
电话加密码 发布:2025-07-16 18:29:12 浏览:66
河马云脚本 发布:2025-07-16 18:29:03 浏览:148
格物致知编程 发布:2025-07-16 18:07:54 浏览:950
戴尔服务器系统设置如何设置 发布:2025-07-16 18:02:09 浏览:961
为什么换安卓这么难 发布:2025-07-16 17:14:44 浏览:423