| 程序内存 | 地址空间 | 可执行文件节 |
| 代码 | 代码 | 代码 |
| 初始化数据 | 数据 | 数据 |
| BSS | 数据 | BSS |
| 堆 | 数据 | |
| 栈 | 栈 |
可执行程序段和他们的位置
内存管理的几个函数
void *calloc(size_t nmemb, size_t size); //分配后用零来填充
void *malloc(size_t size); //分配原始内存
void free(void *ptr); //释放内存
void realloc(void *ptr, size_t size); //改变已分配内存的大小例
int x,y,z;
} *coordinates;
unsigned int count; //我们需要多少数量
size_t amount; //要分配的内存总量
/*..以某种方式决定数量..*/
amount = count * sizeof(struct coord); //要分配多少字节
coordinates = (struct coord *)malloc(amount); //得到地址空间
if(coordinates == NULL){
/*错误报告,重新获得或者放弃*/
}
/*..使用coordinates..*/
步骤
(1)声明一个适当类型的指针,准备指向分配好的内存。
(2)计算要分配的内存的字节数。用单个目标的字节大小乘以需要目标个数所得值就是需要的字节数。单个目标大小是通过C的sizeof算子提取出来的。
(3)在调用malloc()分配存储空间之后,将该函数的返回值赋给另一个指针变量。将malloc()返回值的类型转换到要赋值的变量的类型是个好习惯
(4)检查返回值。
malloc()返回的内存是"没有"初始化的。应马上用有效数据或至少是用零来初始化这块内存。
|
推荐: |
关于free()的几个要注意的地方
访问释放掉的内存
这么做不管从可靠性和可移植性等各方面都是愚蠢的。所以最好在释放内存后把悬挂指针设置为NULL
pointer = NULL; //It's not necessarily, but a good idea
两次释放相同指针
缓存过多和缓存过少
释放内存失败
GLIBC 中读取整个行:getline()和getdelim()
#include <sys/types.h> //为了使用ssize_t ssize_t 是"有符号的size_t"
#define _GNU_SOURCE 1
ssize_t getline(char **lineptr, size_t *n, FILE *stream);
ssize_t getdelim(char **lineptr, size_t *n, int delim, FILE *stream);
这两个函数都可以为你管理动态存储空间,确保包含输入行的缓冲区总是足以存下整个输入行,他们的区别在于getline直到遇到换行符才停止读取,而getdelim使用的是用户提供的分界符。
|
char **lineptr: |
例
#include <sys/types.h>
#define _GNU_SOURCE 1
/*..main --- 读取行并显示出来,直到EOF..*/
int main(void)
{
char *line = NULL;
size_t size = 0;
ssize_t ret;
while ((ret = getline(&line, &size, stdin)) != -1)
printf("(%lu) %s", size, line);
return 0;
}
字符串拷贝 strdup()
#include <string.h>
char *strdup(const char *str);
浙公网安备 33010602011771号