一、静态数组的缺点
1.静态数组的长度必须事先指定,且数组长度只能是长整数,不能是变量。
2.给静态数组分配的内存无法手动释放,直到程序运行完毕,数组占用的内存空间才会被系统释放。
3.数组长度一旦固定,其长度就不能再更改。
4.静态数组不能跨函数调用
二、动态内存分配
为什么需要动态内存分配?
因为通过动态内存分配构建动态数组很好的解决了静态数组的4个缺点。
对内存的动态内存分配主要是通过系统提供的库函数来实现的,主要有 malloc, calloc, free, realloc这4个函数。
例: 使用malloc函数
C语言代码
#include <stdio.h>
#include <malloc.h> //malloc函数头文件
int main(void)
{
int *p = (int *)malloc(4);
/*
1. 要使用malloc函数,必须添加malloc.h这个头文件
2. malloc函数只有一个形参,并且形参是整型
3. 4表示请求系统为本程序分配4个字节
4. malloc函数只能返回第一个字节的地址
5. 分配了8个字节, p变量占4个字节, p所指向的内存也占4个字节
6. p本身所占的内存是静态分配的, p所指向的内存是动态分配的
*/
*p = 5; // *p 代表的就是一个int变量, 只不过*p这个整型变量的是动态分配的
printf("%d\n", *p);
free(p); /* freep(p)表示把p所指向的内存给释放掉 p本身的内存是静态的,不能手动释放,
p本身的内存只能在p变量所在的函数运行终止时由系统自动释放 */
printf("%d\n", *p); //释放后,内存中为垃圾值
return 0;
}
devc运行结果
三、动态一维数组构建
//动态构建一维数组
#include <stdio.h>
#include <malloc.h>
int main(void)
{
int len, i;
int *p;
//动态构建一维数组
printf("please enter the number: ");
scanf("%d", &len);
p = (int *)malloc(4 * len); /* 动态构建一个一维数组,数组长度为len ,数组名为p,
数组元素类型为int型,类似于int p[len]*/
//对一维数组进行赋值
printf("please enter array value: ");
for (i = 0; i < len; i++)
scanf("%d", &p[i]);
//scanf("%d", p+i);
//对一维数组进行输出
printf("output array value: ");
for (i = 0; i < len; i++)
printf("%d ", p[i]);
//printf("%d ", *(p+i));
printf("\n");
//释放动态分配的数组
free(p);
return 0;
}
devc运行结果
补充:一个指针变量到底占几个字节
例如:
char *p,p是指向char类型的指针变量,占1个字节。
int *q,q是指向int类型的指针变量,占4个字节。
double *r,r是指向double类型的指针变量,占8个字节。
p,q,r所指向的变量所占字节数不同,但p,q,r本身所占字节数是相同的。
在32位系统中,一个指针变量本身占4个字节,在64位系统中,一个指针变量本身占8个字节
#include <stdio.h>
int main(void)
{
char ch = 'A';
int i = 99;
double x = 66.6;
char *p = &ch;
int *q = &i;
double *r = &x;
printf("%d %d %d\n", sizeof(p), sizeof(q), sizeof(r)); //输出p,q,r本身所占字节
printf("%d %d %d\n", sizeof(*p), sizeof(*q), sizeof(*r)); //输出p,q,r指向的变量所占字节
return 0;
}
运行结果