70,020
社区成员




//使用动态分配
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
int i,L;
char *p;
void main() {
for (i=0;i<20000;i++) {
L=rand();
p=malloc(L);
if (NULL==p) {
printf("malloc error!\n");
continue;
}
memset(p,0,L);
free(p);
}
}
//不使用动态分配
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#define MAXLEN 30000
int i,L;
char buf[MAXLEN];
char *p;
void main() {
p=&buf[0];
for (i=0;i<20000;i++) {
L=rand();
if (L>MAXLEN) {
printf("L>MAXLEN==%d, ignore spilth.\n",MAXLEN);
L=MAXLEN;
}
memset(p,0,L);
}
}
//将c:\\tmp文件夹下的所有文件的内容全部放到用malloc分配的内存中
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <io.h>
struct FB {
char fn[256];
size_t fl;
char *b;
struct FB *next;
struct FB *prev;
} *fh,*fb,*ft;
char ln[256];
char fpn[256];
FILE *af;
FILE *f;
int L,n;
int main() {
system("dir /b /a-d c:\\tmp\\*.* >c:\\allfn.txt");
af=fopen("c:\\allfn.txt","r");
if (NULL==af) {
printf("Can not open file c:\\allfn.txt!\n");
return 1;
}
fh=NULL;
fb=NULL;
n=0;
while (1) {
if (NULL==fgets(ln,256,af)) break;
L=strlen(ln);
if ('\n'==ln[L-1]) ln[L-1]=0;
printf("read %s\n",ln);
strcpy(fpn,"c:\\tmp\\");
strcat(fpn,ln);
ft=(struct FB *)malloc(sizeof(struct FB));
if (NULL==ft) {
printf("Can not malloc ft!\n");
fclose(af);
return 2;//之前的malloc在main退出后由操作系统自动free
}
printf("ft[%d]==%p\n",n,ft);
strcpy(ft->fn,fpn);
f=fopen(fpn,"rb");
if (NULL==f) {
printf("Can not open file %s!\n",fpn);
fclose(af);
return 3;//之前的malloc在main退出后由操作系统自动free
}
ft->fl=_filelength(fileno(f));
ft->b=malloc(ft->fl);
if (NULL==ft->b) {
printf("Can not malloc ft->b!\n");
fclose(f);
fclose(af);
return 4;//之前的malloc在main退出后由操作系统自动free
}
printf("ft[%d]->b==%p\n",n,ft->b);
if (ft->fl!=fread(ft->b,1,ft->fl,f)) {
printf("fread error!\n");
fclose(f);
fclose(af);
return 5;//之前的malloc在main退出后由操作系统自动free
}
fclose(f);
ft->next=NULL;
if (NULL==fh) {
ft->prev=NULL;
fh=ft;
} else {
fb->next=ft;
ft->prev=fb;
}
fb=ft;
n++;
}
fclose(af);
printf("-----list-----\n");
for (ft=fh;NULL!=ft;ft=ft->next) {
printf("%8d %s\n",ft->fl,ft->fn);
if (NULL!=ft) fb=ft;
}
printf("-----free-----\n");
n--;
if (NULL!=fh) {
for (ft=fb->prev;NULL!=ft;ft=ft->prev) {
if (NULL!=ft->next->b) {
printf("ft[%d]->b==%p\n",n,ft->next->b);
free(ft->next->b);
}
if (NULL!=ft->next) {
printf("ft[%d]==%p\n",n,ft->next);
free(ft->next);
}
n--;
}
if (NULL!=fh->b) {
printf("ft[0]->b==%p\n",fh->b);
free(fh->b);
}
printf("ft[0]==%p\n",fh);
free(fh);
}
return 0;
}
//C:\tmp\tmp\Debug>dir /a-d c:\tmp
// 驱动器 C 中的卷是 C_HD5_1
// 卷的序列号是 1817-D526
//
// c:\tmp 的目录
//
//找不到文件
//
//C:\tmp\tmp\Debug>tmp
//找不到文件
//-----list-----
//-----free-----
//
//C:\tmp\tmp\Debug>dir /a-d c:\tmp
// 驱动器 C 中的卷是 C_HD5_1
// 卷的序列号是 1817-D526
//
// c:\tmp 的目录
//
//2011-06-30 18:04 44,840 my_c.rar
//2011-06-30 17:18 1,036 err.frm
//2011-06-30 14:32 14,243 出租.txt
//2011-06-28 12:08 23,681 MSDN98书签.txt
// 4 个文件 83,800 字节
// 0 个目录 17,041,870,848 可用字节
//
//C:\tmp\tmp\Debug>tmp
//read my_c.rar
//ft[0]==00421800
//ft[0]->b==00520068
//read err.frm
//ft[1]==00421670
//ft[1]->b==0052AFC0
//read 出租.txt
//ft[2]==00421530
//ft[2]->b==00378F28
//read MSDN98书签.txt
//ft[3]==004213F0
//ft[3]->b==0052B3F8
//-----list-----
// 44840 c:\tmp\my_c.rar
// 1036 c:\tmp\err.frm
// 14243 c:\tmp\出租.txt
// 23681 c:\tmp\MSDN98书签.txt
//-----free-----
//ft[3]->b==0052B3F8
//ft[3]==004213F0
//ft[2]->b==00378F28
//ft[2]==00421530
//ft[1]->b==0052AFC0
//ft[1]==00421670
//ft[0]->b==00520068
//ft[0]==00421800
//
//C:\tmp\tmp\Debug>
//循环向a函数每次发送200个字节长度(这个是固定的)的buffer,
//a函数中需要将循环传进来的buffer,组成240字节(也是固定的)的新buffer进行处理,
//在处理的时候每次从新buffer中取两个字节打印
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <process.h>
#include <io.h>
//Log{
#define MAXLOGSIZE 20000000
#define MAXLINSIZE 16000
#include <time.h>
#include <sys/timeb.h>
#include <stdarg.h>
char logfilename1[]="MyLog1.log";
char logfilename2[]="MyLog2.log";
static char logstr[MAXLINSIZE+1];
char datestr[16];
char timestr[16];
char mss[4];
CRITICAL_SECTION cs_log;
FILE *flog;
void Lock(CRITICAL_SECTION *l) {
EnterCriticalSection(l);
}
void Unlock(CRITICAL_SECTION *l) {
LeaveCriticalSection(l);
}
void LogV(const char *pszFmt,va_list argp) {
struct tm *now;
struct timeb tb;
if (NULL==pszFmt||0==pszFmt[0]) return;
_vsnprintf(logstr,MAXLINSIZE,pszFmt,argp);
ftime(&tb);
now=localtime(&tb.time);
sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);
sprintf(timestr,"%02d:%02d:%02d",now->tm_hour ,now->tm_min ,now->tm_sec );
sprintf(mss,"%03d",tb.millitm);
printf("%s %s.%s %s",datestr,timestr,mss,logstr);
flog=fopen(logfilename1,"a");
if (NULL!=flog) {
fprintf(flog,"%s %s.%s %s",datestr,timestr,mss,logstr);
if (ftell(flog)>MAXLOGSIZE) {
fclose(flog);
if (rename(logfilename1,logfilename2)) {
remove(logfilename2);
rename(logfilename1,logfilename2);
}
} else {
fclose(flog);
}
}
}
void Log(const char *pszFmt,...) {
va_list argp;
Lock(&cs_log);
va_start(argp,pszFmt);
LogV(pszFmt,argp);
va_end(argp);
Unlock(&cs_log);
}
//Log}
#define ASIZE 200
#define BSIZE 240
#define CSIZE 2
char Abuf[ASIZE];
char Cbuf[CSIZE];
CRITICAL_SECTION cs_HEX ;
CRITICAL_SECTION cs_BBB ;
struct FIFO_BUFFER {
int head;
int tail;
int size;
char data[BSIZE];
} BBB;
int No_Loop=0;
void HexDump(int cn,char *buf,int len) {
int i,j,k;
char binstr[80];
Lock(&cs_HEX);
for (i=0;i<len;i++) {
if (0==(i%16)) {
sprintf(binstr,"%03d %04x -",cn,i);
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
} else if (15==(i%16)) {
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
sprintf(binstr,"%s ",binstr);
for (j=i-15;j<=i;j++) {
sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
}
Log("%s\n",binstr);
} else {
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
}
}
if (0!=(i%16)) {
k=16-(i%16);
for (j=0;j<k;j++) {
sprintf(binstr,"%s ",binstr);
}
sprintf(binstr,"%s ",binstr);
k=16-k;
for (j=i-k;j<i;j++) {
sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
}
Log("%s\n",binstr);
}
Unlock(&cs_HEX);
}
int GetFromRBuf(int cn,CRITICAL_SECTION *cs,FIFO_BUFFER *fbuf,char *buf,int len) {
int lent,len1,len2;
lent=0;
Lock(cs);
if (fbuf->size>=len) {
lent=len;
if (fbuf->head+lent>BSIZE) {
len1=BSIZE-fbuf->head;
memcpy(buf ,fbuf->data+fbuf->head,len1);
len2=lent-len1;
memcpy(buf+len1,fbuf->data ,len2);
fbuf->head=len2;
} else {
memcpy(buf ,fbuf->data+fbuf->head,lent);
fbuf->head+=lent;
}
fbuf->size-=lent;
}
Unlock(cs);
return lent;
}
void thdB(void *pcn) {
char *recv_buf;
int recv_nbytes;
int cn;
int wc;
int pb;
cn=(int)pcn;
Log("%03d thdB thread begin...\n",cn);
while (1) {
Sleep(10);
recv_buf=(char *)Cbuf;
recv_nbytes=CSIZE;
wc=0;
while (1) {
pb=GetFromRBuf(cn,&cs_BBB,&BBB,recv_buf,recv_nbytes);
if (pb) {
Log("%03d recv %d bytes\n",cn,pb);
HexDump(cn,recv_buf,pb);
Sleep(1);
} else {
Sleep(1000);
}
if (No_Loop) break;//
wc++;
if (wc>3600) Log("%03d %d==wc>3600!\n",cn,wc);
}
if (No_Loop) break;//
}
}
int PutToRBuf(int cn,CRITICAL_SECTION *cs,FIFO_BUFFER *fbuf,char *buf,int len) {
int lent,len1,len2;
Lock(cs);
lent=len;
if (fbuf->size+lent>BSIZE) {
lent=BSIZE-fbuf->size;
}
if (fbuf->tail+lent>BSIZE) {
len1=BSIZE-fbuf->tail;
memcpy(fbuf->data+fbuf->tail,buf ,len1);
len2=lent-len1;
memcpy(fbuf->data ,buf+len1,len2);
fbuf->tail=len2;
} else {
memcpy(fbuf->data+fbuf->tail,buf ,lent);
fbuf->tail+=lent;
}
fbuf->size+=lent;
Unlock(cs);
return lent;
}
void thdA(void *pcn) {
char *send_buf;
int send_nbytes;
int cn;
int wc;
int a;
int pa;
cn=(int)pcn;
Log("%03d thdA thread begin...\n",cn);
a=0;
while (1) {
Sleep(100);
memset(Abuf,a,ASIZE);
a=(a+1)%256;
if (16==a) {No_Loop=1;break;}//去掉这句可以让程序一直循环直到按Ctrl+C或Ctrl+Break或当前目录下存在文件No_Loop
send_buf=(char *)Abuf;
send_nbytes=ASIZE;
Log("%03d sending %d bytes\n",cn,send_nbytes);
HexDump(cn,send_buf,send_nbytes);
wc=0;
while (1) {
pa=PutToRBuf(cn,&cs_BBB,&BBB,send_buf,send_nbytes);
Log("%03d sent %d bytes\n",cn,pa);
HexDump(cn,send_buf,pa);
send_buf+=pa;
send_nbytes-=pa;
if (send_nbytes<=0) break;//
Sleep(1000);
if (No_Loop) break;//
wc++;
if (wc>3600) Log("%03d %d==wc>3600!\n",cn,wc);
}
if (No_Loop) break;//
}
}
int main() {
InitializeCriticalSection(&cs_log );
Log("Start===========================================================\n");
InitializeCriticalSection(&cs_HEX );
InitializeCriticalSection(&cs_BBB );
BBB.head=0;
BBB.tail=0;
BBB.size=0;
_beginthread((void(__cdecl *)(void *))thdA,0,(void *)1);
_beginthread((void(__cdecl *)(void *))thdB,0,(void *)2);
if (!access("No_Loop",0)) {
remove("No_Loop");
if (!access("No_Loop",0)) {
No_Loop=1;
}
}
while (1) {
Sleep(1000);
if (No_Loop) break;//
if (!access("No_Loop",0)) {
No_Loop=1;
}
}
Sleep(3000);
DeleteCriticalSection(&cs_BBB );
DeleteCriticalSection(&cs_HEX );
Log("End=============================================================\n");
DeleteCriticalSection(&cs_log );
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include<string.h>
#define BACP_ALARM 0xb0
typedef struct ns_MsgItem
{
char *msg;
}NS_MSGITEM_t;
typedef struct ns_MsgList
{
struct ns_MsgItem **__ptr;
int __size;
}NS_MSGLIST_t;
struct pkt_bacphdr
{
u_int32_t size;
char data[0];
} __attribute__((packed));
typedef struct pkt_bacphdr PKT_BACPHDR_t;
int main()
{
char *tmp="123456789";
//NS_MSGLIST_t ns_list1;
NS_MSGITEM_t **ns_item1 = NULL;
NS_MSGLIST_t *ns_list2=NULL;
PKT_BACPHDR_t *pkt = NULL;
int size;
size=sizeof(PKT_BACPHDR_t)+sizeof(NS_MSGLIST_t)+sizeof(NS_MSGITEM_t)+sizeof(char [strlen(tmp)+1]);
pkt=(PKT_BACPHDR_t*)malloc(size);
ns_list2=(NS_MSGLIST_t *)pkt->data;
ns_list2->__size=1;
ns_list2->__ptr=(NS_MSGITEM_t**)(pkt->data+sizeof(int));
ns_list2->__ptr[0]=(NS_MSGITEM_t *)(pkt->data+sizeof(NS_MSGLIST_t));
(ns_list2->__ptr[0])->msg=(char *)(pkt->data+sizeof(NS_MSGLIST_t)+sizeof(NS_MSGITEM_t));
printf("addr of info is %p. addr of data is %p ,%p.,%p,%p,%p,%p,%p\n", pkt, pkt->data,ns_list2,ns_list2->__ptr,ns_list2->__ptr[0],((ns_list2->__ptr[0])->msg)+10,((ns_list2->__ptr[0])->msg),pkt);
strcpy((ns_list2->__ptr[0])->msg,tmp);
NS_MSGLIST_t *ns_list3=NULL;
ns_list3=(NS_MSGLIST_t *)pkt->data;
printf("%s\n",ns_list3->__ptr[0]->msg);
pkt->size=1;
free(pkt);
}
这部分代码 通过valgrind 测试没有内存泄露 你看看 这种是不是一种解决方法#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <malloc.h>
#pragma pack(push,1)
struct A {
char *msg;
};
struct B {
struct A **__ptr;
int size;
};
struct PKT {
unsigned int size;
char data[0];
};
#pragma pack(pop)
int main() {
struct PKT *pPK;
struct B *pb;
int i;
pPK=(struct PKT *)malloc(sizeof(struct PKT)+sizeof(struct B));
if (NULL==pPK) return 1;
pPK->size=sizeof(struct PKT)+sizeof(struct B);
pb=(struct B *)(&(pPK->data));
pb->__ptr=(struct A **)malloc(2*sizeof(struct A *));
if (NULL==pb->__ptr) return 2;
pb->size=2;
pb->__ptr[0]=(struct A *)malloc(sizeof(struct A));
if (NULL==pb->__ptr[0]) return 3;
pb->__ptr[0]->msg=(char *)malloc(10*sizeof(char));
if (NULL==pb->__ptr[0]->msg) return 4;
strcpy(pb->__ptr[0]->msg,"123456789");
pb->__ptr[1]=(struct A *)malloc(sizeof(struct A));
if (NULL==pb->__ptr[1]) return 3;
pb->__ptr[1]->msg=(char *)malloc(20*sizeof(char));
if (NULL==pb->__ptr[1]->msg) return 4;
strcpy(pb->__ptr[1]->msg,"1234567890123456789");
printf("pPK==%p\n",pPK);
printf("pPK->size==%d,pPK->data==%p\n",pPK->size,pPK->data);
printf("pb==%p\n",pb);
printf("pb->size==%d,pb->__ptr==%p\n",pb->size,pb->__ptr);
printf("pb->__ptr[0]==%p pb->__ptr[0]->msg==%p \"%s\"\n",pb->__ptr[0],pb->__ptr[0]->msg,pb->__ptr[0]->msg);
printf("pb->__ptr[1]==%p pb->__ptr[1]->msg==%p \"%s\"\n",pb->__ptr[1],pb->__ptr[1]->msg,pb->__ptr[1]->msg);
pb=(struct B *)&pPK->data;
for (i=pb->size-1;i>=0;i--) {
free(pb->__ptr[i]->msg);
free(pb->__ptr[i]);
}
free(pb->__ptr);
free(pPK);
return 0;
}
//pPK==004119A0
//pPK->size==12,pPK->data==004119A4
//pb==004119A4
//pb->size==2,pb->__ptr==00411960
//pb->__ptr[0]==00410030 pb->__ptr[0]->msg==00411920 "123456789"
//pb->__ptr[1]==004118F0 pb->__ptr[1]->msg==004118B0 "1234567890123456789"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <malloc.h>
#pragma pack(push,1)
typedef struct a {
char *msg;
} A;
typedef struct b {
struct A **__ptr;
int size;
} B;
struct pkt {
unsigned int size;
char data[0];
};
typedef struct pkt PKT;
#pragma pack(pop)
int main() {
PKT *msg;
B *pb;
int i;
msg=(PKT *)malloc(sizeof(PKT)+sizeof(B));
if (NULL==msg) return 1;
msg->size=sizeof(PKT)+sizeof(B);
pb=(B *)&msg->data;
pb->__ptr=(A **)malloc(2*sizeof(A *));
if (NULL==pb->__ptr) return 2;
pb->size=2;
pb->__ptr[0]=(A *)malloc(10*sizeof(char));
if (NULL==pb->__ptr[0]) return 3;
strcpy(pb->__ptr[0],"123456789");
pb->__ptr[1]=(A *)malloc(20*sizeof(char));
if (NULL==pb->__ptr[1]) return 3;
strcpy(pb->__ptr[1],"1234567890123456789");
printf("msg==%p\n",msg);
printf("msg->size==%d,msg->data==%p\n",msg->size,msg->data);
printf("pb==%p\n",pb);
printf("pb->size==%d,pb->__ptr==%p\n",pb->size,pb->__ptr);
printf("pb->__ptr[0]==%p \"%s\",pb->__ptr[1]==%p \"%s\"\n",pb->__ptr[0],pb->__ptr[0],pb->__ptr[1],pb->__ptr[1]);
pb=(B *)&msg->data;
for (i=pb->size-1;i>=0;i--) free(pb->__ptr[i]);
free(pb->__ptr);
free(msg);
return 0;
}