C语言中内存管理主要分为两种:静态分配和动态分配。
-
静态分配:在程序编译阶段就分配好内存,变量在整个程序运行期间都存在,并且内存地址不会改变。静态分配可以通过以下几种方式实现:
-
局部静态变量:在函数中声明,但变量的存储空间在程序执行期间都存在,且只会被初始化一次。例如:
void func() {
static int count = 0;
count++;
printf("count:%d\n", count);
}
- 全局变量:在任何函数之外定义的变量,它们的存储空间在程序运行期间都存在。如果没有显示的赋值,它们会自动初始化为0。例如:
int global_var; // 隐式初始化为0
- 静态全局变量:作用范围仅限于文件内部,与全局变量类似,但不能被其他文件访问。例如:
static int static_var; // 仅限于文件内部访问
-
动态分配:需要在程序运行时才能分配内存,这种方式允许应用程序根据需要动态地分配或者释放内存。动态内存管理包括内存分配和内存释放两个部分。
-
内存分配:C语言提供了两种动态内存分配函数:malloc()和calloc()。它们都位于头文件stdlib.h中。
-
malloc()函数:动态地分配一块内存并返回指向这块内存的指针。
c
#include <stdlib.h>
void* malloc(size_t size);
- calloc()函数:与malloc()函数功能相似,但是它会自动清零分配内存的空间。
c
#include <stdlib.h>
void* calloc(size_t n, size_t size);
- 内存释放:在使用完之后必须释放已分配的内存,否则可能会导致内存泄露。C语言提供了一个函数用于释放动态分配的内存:free()。
c
#include <stdlib.h>
void free(void* ptr);
下面是两个示例:
- 实现一个动态数组。
int main() {
int n;
printf("please input the size of array:\n");
scanf("%d", &n);
int *p = (int*)malloc(n * sizeof(int)); // 分配n个int型变量所占内存大小的空间
if (p == NULL) {
printf("out of memory\n");
return 1;
}
printf("please input the elements of array:\n");
for (int i = 0; i < n; i++) {
scanf("%d", &p[i]); // 动态数组中存储数据
}
printf("the elements of array:\n");
for (int i = 0; i < n; i++) {
printf("%d ", p[i]); // 输出动态数组中的数据
}
free(p); // 释放动态数组占用的空间
return 0;
}
- 动态分配结构体。
struct student {
char name[20];
int age;
double score;
};
int main() {
char name[20];
int age;
double score;
struct student *p = (struct student*)malloc(sizeof(struct student)); // 分配结构体所占内存大小的空间
if (p == NULL) {
printf("out of memory\n");
return 1;
}
printf("please enter name, age and score:\n");
scanf("%s %d %lf", name, &age, &score);
strcpy(p->name, name); // 动态分配结构体中存储数据
p->age = age;
p->score = score;
printf("name:%s, age:%d, score:%.1f\n", p->name, p->age, p->score); // 输出动态分配结构体中的数据
free(p); // 释放动态分配结构体所占内存大小的空间
return 0;
}
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言中如何进行内存管理? - Python技术站