动态内存分配
在学习数组的过程中,在输入数组时,原本想过scanf定义数组的大小再输入数组的各值,却报错。
发现原因:
1.定义数组的时必须指定数组长度
2.数组长度是在编译期就必须决定的
所以此时需要用到C语言中的动态内存分配。
通过动态内存分配,则代码可以如此来实现。
#include<stdio.h>#include<stdlib.h>int main(){int *a;int i,m,n;scanf("%d",&n);a = (int*)malloc(sizeof(int)*n);for (i =0;i<n;i++)scanf("%d",(a+i));for (i = 0;i<n;i++)printf("%d\n",*(a+i));}
那么
inta = (int)malloc(n*sizeof(int));
代表什么意思呢?
int *a=(int)malloc(nsizeof(int));
表示定义一个int类型的指针变量a,并申请nsizeof(int)个字节(即4n个字节)的存储空间。
malloc是在C语言中是一个申请内存单元的函数。
函数原型:void *malloc(unsigned size);
功 能:分配size个字节的内存空间
返 回 值:成功,返回分配的内存单元的起始地址;否则返回0
malloc函数介绍
在C语言中,使用malloc函数来申请内存。函数原型如下:
#include<stdlib.h>
void *malloc(size_t size);
参数size代表需要动态申请的内存的字节数,若内存申请成功,函数返回申请到的内存的起始地址,若申请失败,返回NULL, 在使用该函数时应注意以下几点
1.只关心申请内存的大小,该函数的参数很简单,只有申请内存的大小,单位是字节
2.申请的是一块连续的内存,该函数一定是申请一块连续的区间,可能申请到内存比实际申请的大,但也有可能申请不到,若申请失败,则返回NULL
3.返回值类型是void*,函数的返回值是void*,不是某种具体类型的指针,可以理解成该函数只是申请内存,对在内存中存储什么类型的数据,没有要求,因此,返回值是void*,实际编程中,根据实际情况将void*转换成需要的指针类型
4.显示初始化,注意:堆区是不会自动在分配时做初始化的(包括清零),所以程序中需要显示的初始化