1,如果一个程序大量调用malloc,程序的很多时间将会消耗在malloc函数的调用上.
2,编写自己的malloc.
给出一段模板代码:
#define NODESIZE 8
#define NODEGROUP 100
int nodeleft=0;
char* freenode;
void* myMalloc(int size)
{
void* p;
if(size!=NODESIZE)
return malloc(size);
if(nodeleft==0)
{
freenode=malloc(NODESIZE*NODEGROUP);
nodeleft=NODEGROUP;
}
nodeleft--;
p=(void*)freenode;
freenode+=NODESIZE;
return p;
}
3,统计单词个数的那个实例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct node *nodeptr;
typedef struct node
{
char *word;
int count;
nodeptr next;
} node;
#define NHASH 29989
#define MULT 31
nodeptr bin[NHASH];
unsigned int hash(char *p)
{
unsigned int h = 0;
for ( ; *p; p++)
h = MULT * h + *p;
return h % NHASH;
}
#define NODEGROUP 1000
int nodesleft = 0;
//注意这里freenode的声明
nodeptr freenode;
nodeptr nmalloc()
{
if (nodesleft == 0)
{
freenode = malloc(NODEGROUP*sizeof(node));
nodesleft = NODEGROUP;
}
nodesleft--;
return freenode++;
}
#define CHARGROUP 10000
int charsleft = 0;
char *freechar;
char *smalloc(int n)
{
if (charsleft < n) {
freechar = malloc(n+CHARGROUP);
charsleft = n+CHARGROUP;
}
charsleft -= n;
freechar += n; //移动freechar
return freechar - n;
}
void incword(char *s)
{
nodeptr p;
int h = hash(s);
for (p = bin[h]; p != NULL; p = p->next)
if (strcmp(s, p->word) == 0) {
(p->count)++;
return;
}
p = (nodeptr)nmalloc();
p->count = 1;
p->word = smalloc(strlen(s)+1);
strcpy(p->word, s);
p->next = bin[h];
bin[h] = p;
}
int main()
{
freopen("genetic.txt","r",stdin);
int i;
nodeptr p;
char buf[100];
for (i = 0; i < NHASH; i++)
bin[i] = NULL;
while (scanf("%s", buf) != EOF)
incword(buf);
for (i = 0; i < NHASH; i++)
for (p = bin[i]; p != NULL; p = p->next)
printf("%s %d\n", p->word, p->count);
return 0;
}
分享到:
相关推荐
自己写的动态内存管理源码,其中包含 malloc.c和 malloc.h两个文件,可以动态申请和释放内存
lunix下用c编写malloc函数
给学生的路线在本实验中,您将为 C 程序编写一个动态存储分配器。 目标是实现一个正确、高效和快速的分配器。 文件: mm.{c,h} 你的解决方案 malloc 包。 mm.c 是您将要提交的文件,并且是您应该修改的唯一文件。 ...
小弟自己编写的Json类库,希望大家碰提提意见 QQ:61844330
基于我很久以前在glibc中使用__malloc_hook / __free_hook编写的内容。 由于现在已将这些标记为“已弃用”,因此我使用以下建议重写了这些内容: 构建: gcc -Wall -o fml.so fml.c -shared -fPIC -ldl -lsqlite3...
编写递归算法,在二叉树中求位于先序序列中第K个位置的结点 [输入] 按照先序序列的顺序输入该结点的内容。其输入abd eh cf i g 。输入要求的位置 [输出] 若二叉树不空,按先序序列输出,求出所求位置的结点 [存储...
相比于上一个程序将文件提取出的数据导入到结构体数组中,本程序改为malloc动态分配内存空间,具体操作过程请看我的博客: https://blog.csdn.net/qq_38364548/article/details/128851020 本程序是仿照仿照严老师...
嵌入式优质项目,资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松copy复刻,拿到资料包后可轻松复现出一样的项目。 本人单片机开发经验充足,深耕嵌入式领域,有任何使用问题欢迎随时与我联系,我会...
在本实验中,您将为C程序编写一个动态存储分配器,即您自己的malloc , free和realloc例程版本。 鼓励您创造性地探索设计空间并实现正确,高效和快速的分配器。 后勤 您最多可以两个人组成一组。 对作业的任何澄清和...
Unix系统编程---makefile的编写Unix系统编程---makefile的编写Unix系统编程---makefile的编写
系统函数的在red hat 下c编程基本的应用 1、 通讯录采用struct定义结构;...2、 通讯录数据使用malloc动态分配内存,而不要使用静态数组; 3、 尽量把通讯录列表建成一种单向链表的形式,提高新增和删除的效率。
用C语言编写的矩阵算法,用于加减乘除、求逆、求det、求norm等等。 可以用于嵌入式系统,唯一的限制是能用malloc函数。
本书深入浅出地论述了C语言的的各个基础方面,特别是指针,强调编写高质量代码,C/C++菜鸟到大牛的必备书籍之一。
例程经过精心编写,简单好用。 2、代码使用KEIL HAL库开发,当前在STM32F103运行,如果是STM32F103其他型号芯片,依然适用,请自行更改KEIL芯片型号以及FLASH容量即可。 3、软件下载时,请注意keil选择项是jlink还是...
(1)编写二叉排序树的基本操作函数。 ①查找结点函数 SearchNode(TREE *tree,int key,TREE **pkpt,TREE **kpt) ②二叉排序树插入函数 InsertNode(TREE **TREE,int key) ③二叉排序树删除函数 DeleteNode...
火车票务系统,用c语言编写的。 /*录入函数*/ void RearInsert(LinkList &L) //尾部插入结点 { char chars[5][20] ; float price ; LinkList p = L; printf("输入添加的记录: \n") ; printf("请输入列车...
parttwo 菜单的工作原理及编写应用parttwo 菜单的工作原理及编写应用parttwo 菜单的工作原理及编写应用parttwo 菜单的工作原理及编写应用
4、针对构想出来的界面进行程序的编写。 最后,感谢老师您对我的指导和从百忙中抽空看我的设计,谢谢! 附件: 源程序: #include "stdio.h" /*I/O函数*/ #include "stdlib.h" /*其它说明*/ #include ...
partone 菜单的工作原理及编写应用partone 菜单的工作原理及编写应用partone 菜单的工作原理及编写应用partone 菜单的工作原理及编写应用
head=(pcb *)malloc(sizeof(pcb));/*创建一个空表头*/ p=head; for(i=1;i;i++)/*用循环来创建指定个结点*/ { q=(pcb *)malloc(sizeof(pcb)); p->next=q; q->num=i; q->next=NULL; q->priority=(int)10*...