专题:动态内存分配----基础概念篇
传统数组的缺点:
1. 数组长度必须是事先定义的,而且必须是常整型,不能是变量。
例:
int a[5]; //ok
int len=5; int a[len]; //error
2. 传统形式定义的数组,该数组的内存空间程序员无法手动释放。
在一个函数运行期间,系统为该函数中数组所分配的空间会一直存在,直到该函数运行结束,数组的空间
才会被系统自动释放。
3. 数组的长度一旦定义,期长度就不能更改
数组的长度不能再函数运行的过程中动态的扩充或缩小
4. A函数定义的数组,在A函数运行期间可以被其他函数使用,但A函数运行结束后,A函数中的数组就不能被其他函数使用。
传统定义的数组不能跨函数使用。
/****************************************************
malloc函数的介绍和使用
malloc:是memory(内存)和allocate(分配)两个单词缩写的。
***************************************************/
#include <stdio.h>
#include <malloc.h>
int main(void)
{
int i=5;
int * p=(int *)malloc(4);/* Malloc向系统申请分配指定size个字节的内存空间。返回类型是 void* 类型。void* 表示未确定类型的指针。C,C++规定,void* 类型可以强制转换为任何其它类型的指针。
1. 要使用malloc函数必须要声明头文件malloc.h
2. malloc函数只有一个形参,并且形参是整型。
3. 4表示内存分配动态存储空间4个字节。
4. 这行总共占8个字节,系统本身为以p的内容为地址的变量分配了静态的4个字节+p指向的动态内存空间4个字节。
5. malloc只能返回第一个字节的地址
6. p本身所占的内存是静态分配的,p所指向的内存是动态分配的。
7. int * 表示强制转换malloc函数所返回的第一个字节地址的内容的类型。
*/
*p=5; //*p代表的就是int类型,只不过和i的分配方式不一样。
printf("%d\n",*p);
free(p);//释放动态内存空间,由程序员来完成的。
return 0;
}
动态一维数组的输入和输出例子:
1 #include<stdio.h>
2 #include<malloc.h>
3 void malloc_1(int *);
4 int main(void)
5 {
6 int a[5]={1,2,3,4,5};//20 byte
7 int len;
8 printf("please input len: ");
9 scanf("%d",&len);
10 int * pArr;
11 pArr=(int *)malloc(4*len);//len==5,20 byte
12 //*pArr=99;
13 printf("please input 5 numbers: ");
14 for(int i=0;i<len;i++)
15 //scanf("%d",&pArr[i]);
16 scanf("%d",pArr+i);
17 *pArr=99;
18 printf("output is: \n");
19 for(int i=0;i<len;i++)
20 {
21 malloc_1(pArr);
22 printf("pArr[%d]=%d\n",i,pArr[i]);
23 }
24 //malloc_1(pArr);
25 // printf("pArr[%d]=%d\n",i,pArr[i]);
26 free(pArr);
27 return 0;
28
29 }
30 void malloc_1(int *q)
31 {
32 *q=100;
33 }