C语言基础_函数
一、程序存储区划分
1、栈区
1)局部变量 函数 循环 分支 都存储在栈区
2)当函数 循环 分支中的局部变量生命周期结束之后(执行结束) 系统销毁并回收存储空间
3)函数返回值返回栈区的内存是不安全的
2、常量区内存
1)常量存储在常量区 数字 字符 字符串等
2)常量区的存储空间也是系统分配和回收的
3)程序运行结束的时候 回收存储空间
4)常量区的数据只能访问 不能修改 修改必崩
char *p = "hello";//在常量区 p[0] = 'i';//修改是错误的 char a1[] ="nihao";//数组操作的字符是在栈区的副本 a1[1] = 'N';
3、静态区
1)全局变量 使用static修饰的局部变量 都存在静态区
2)静态区的内存由系统分配和回收
3)程序运行结束之后 静态区的内存被回收 他的生命周期和程序一样长
4)静态变量如果没有初始值 默认为0
5)在编译时初始化 运行期间可以修改
4、代码区
1)由系统分配和回收
2)程序运行结束之后由系统收回分配的存储空间
3)只能读取不能修改
5、堆区
1)由ios开发工程师负责分配和回收
2)忘记回收会造成内存泄露
3)程序运行结束之后回收堆内存 如果不能及时回收堆内存 程序运行期间可能会因为内存泄露造成堆区内存被全部占用 程序不能运行
二、动态申请内存
void * malloc(size_t); //void * : 表示无类型的指针 可以转换成任意类型的指针 //作用 在堆区开辟指定 size_t 个字节的空间 并把空间的首地址返回
int *p = NULL; p = malloc(4);//int *p = malloc(sizeof(int)); *p = 10; //存储在堆区 float *p1 = malloc(sizeof(float));//开辟指定大小的堆内存 返回空间的首地址 *p1 = 3.55;
1)在堆区开辟一个char类型的数组 有8个字符
char *p2 = malloc(sizeof(char)*8); //使用p2将字符串拷贝到内存中 strcpy(p2, "ios");
2)分配一个整形数组的内存 10个随机元素[30,60]
int *p3 = malloc(sizeof(int)*10); for (int i =0; i<10; i++) { *(p3+i) = arc4random() % 31 +30; printf("%d ",*(p3+i)); }
3)开辟一个结构体内存 存入堆区
typedef struct student{ char name[20]; int age; float score; }Student; int main(int argc, const char * argv[]) { Student *s = malloc(sizeof(Student)); strcpy(s->name, "ios"); s->age = 18; s->score = 90; printf("\n%s %d %f",s->name,s->age,s->score); return 0; }
4)有一个字符串,其中有数字,提取其中的数字要求动态分配内存[先计算出几个数字,然后根据数字的个数开辟空间]
char str[] = "qwer123456df"; int count = 0; for (int i = 0; i<strlen(str); i++) { if (str[i] >= '0' && str[i] <= '9') { count++; } } printf("%d\n",count); int *p = malloc(sizeof(int)*count); count = 0 ; for (int i =0 ; i<strlen(str); i++) { if (str[i] >= '0' && str[i] <= '9') { int res = 0; res = str[i]-'0';//字符转化成数字 *(p+count) = res;//存入堆区 count++; } } for (int i = 0; i<count; i++) { printf("%d ",*(p+i)); } //释放堆区内存 free(p); p = NULL;//指针为空 避免野指针
5)输入三个学员的姓名,动态分配内存,保存学员的姓名,并最后输出[将数组name 保存成指针 指针指向堆区]
char *name[3]={0}; char temp[40] = {0};//中间数组 printf("请输入3个姓名:\n"); for (int i = 0; i < 3; i++) { scanf("%s",temp); getchar(); name[i] = malloc(sizeof(temp)+1); strcpy(name[i], temp); } for (int i=0; i<3; i++) { printf("%s ",name[i]); } for (int i =0; i<3; i++) { free(name[i]); name[i] =NULL; }

浙公网安备 33010602011771号