C语言中对于数组的定义,与Java有所不同。
C语言中的数组,在申明的时候就必须确定数组大小和基本类型。
int arr[10]; // 数组大小10,基本类型int float arr[9]; // 数组大小9,基本类型float而Java语言中,数组的声明的时候:
int[10] arr; // 可以这样定义 int[] arr2; arr2 = new int[10]; // 可以动态申请内存大小,在C语言中是不被允许的看个C语言定义数组的例子:
int n; scanf("%d", &n); int arr[n];这样可以吗?答案:不可以。因为在编译阶段n是未知的,只有在运行时才知道n的大小。
再看一个C语言定义数组的例子:
int n = 10; int arr[n];这样可以吗?答案:不可以。因为在编译阶段n还是未知的,只有在运行时才知道n的大小。而数组的定义必须在编译时就要知道大小,因为要分配内存空间。
如果n的定义是 const int n = 10; 呢?答案:可以。因为这时定义的是常量n,在静态区将n存储起来。相当于Java语言中 static int n = 10;
为什么C语言中定义数组时,要确定数组的大小呢?因为数组在内存中分配区域时,这块区域是连续的。即只有电脑知道数组的大小,才能在内存中找到一块区域用于存放数组,所以要预先知道大小。
程序的栈空间是规定了大小的(好像是2M),数组是存储在栈(stack)中的。如果数组申请的大小超过程序规定的大小,就会报 stackflow(stack溢出)错误。如果真需要这么大,怎么办?不能采用这种定义方式,要动态开辟空间。
int * arr; arr = (int *) malloc(sizeof(int) * 1024 * 1024 * 2); // 开辟40M空间,int类型是4个字节。 // 给数组赋值就可以了 for(int i=0; i<10; i++) { arr[i] = 1; }sizeof 是计算基本数据类型占用的内存空间的大小。如:常说的int是4个字节等。sizeof(int) 计算出来就是4。
sizeof 和赋值数据类型的数据的值无关。如:int i = 10; printf(sizeof(i)); 输出为4。
sizeof 是关键字、操作符,不是函数。
定义大数组时,必须要动态申请。动态申请的空间不会在栈里面,而在堆里面,不受系统分配的限制。但是还要注意一点,占用栈当中的空间,系统会帮我们释放;而占用堆当中的空间,是需要我们手动去释放的。在使用完后调用 delete(arr); 主动释放。否则会有内存溢出。