静态内存指的是在编译时系统自动给其分配的内存,运行结束后会自动释放;静态内存是在栈中分配的;
动态内存是我们程序员手动分配的内存,正常情况下,程序运行结束后,也不会自动释放,所以为了避免发生未知的错误,我们需要手动释放动态内存;动态内存是在堆分配的;
-
动态内存分配问题:
#include<stdio.h> #include<malloc.h>//用于调用malloc()函数 int main() { int i=5; //为变量 i 静态分配了4个字节的内存 int *p=(int *)malloc(4); //将malloc()函数动态分配的4个字节的内存的地址赋给了指针变量 p *p=5; //把‘5’放到了指针变量 p 所储存的地址对应的动态内存单元中 printf("%d",*p); free(p); //记住在程序结束处一定要将动态分配的内存释放掉,因为正常情况下,动态分配的内存是不会随程序的结束而自动释放的 //所以为了避免未知的错误,在程序结束处,一定要用free()释放动态内存,一个malloc()对应一个free() }
1.用到动态内存分配时,需要调用:malloc(int i)函数,该函数储存在头文件<malloc.h>中;malloc()函数只有一个int形参,返回值为【第一个字节的地址】;
2.如图中的(int *)代表将malloc返回的字节地址强制为int *类型,至于为什么一定要强制转换,我的理解是:一个地址,是4个字节,而我们不知道用户使用这段malloc()开辟的空间用来储存什么类型的数据,所以调用malloc()函数是,要对其返回值进行不同类型的强制转换;
3.void* 表示未确定类型的指针,void *可以指向任何类型的数据,更明确的说是指申请内存空间时还不知道用户是用这段空间来存储什么类型的数据(比如是char还是int)所以需要 int*强制转换,说明用来存储int类型数据!
-
理解动态内存的使用:(代码的目的是将 *p 存的100变为200)
#include<stdio.h> #include<malloc.h> void f(int *q) { //*p=200; //错 //q=200; //错 //**q=200; //错 *q=200; //free(q); //错 } int main() { int *p=(int *)malloc(4); *p=100; printf("%d\n",*p); f(p); printf("%d\n",*p); }
1.主函数中指针p 指向了一个动态内存,(*p=10)代表向p指向的动态内存放进了一个“10”;
2.这时printf(*p)自然是p所指向的动态内存中所储存的 “10”
3.流程控制进入子函数f(int *)中,f()先将p所指向的内存数据拷贝给了指针q,此时q也指向了动态内存中所储存的”10“,这时如果想改变动态内存中的数据,只能对*q进行操作,因为在子函数*p并没有定义;
4.也不能直接写”q=20“,因为q是指针,20是int,针型殊途啊;
5.**q更不对了,这种类型是从内向外运算的,q是指针,而*q是变量,而*又只能操作指针类型,所以**q自然属于语法错误;
6.子函数最后也不能free(q),因为我们要printf动态内存中的数据,若free(q),此时q所指向的动态内存被释放掉,再printf(*q)输出的自然是垃圾值(因为此时动态内存中没有手动储存数据)
博主只是一只小菜鸡,若文章有错误或不当之处,请狠狠批评博主 (~ ̄(OO) ̄)ブ