摘要:新手學(xué)習(xí),模擬思想編寫程序數(shù)組中是實(shí)際上存在的最小空間大小個(gè)數(shù)內(nèi)存使用完了的時(shí)候正常的,在范圍內(nèi)的往后面偏移一位返回新的,下一個(gè)元素的存放位置只能通過這樣子,將個(gè)字節(jié)的內(nèi)存轉(zhuǎn)為整數(shù)
新手學(xué)習(xí)nginx,模擬nginx思想編寫程序 nginx 數(shù)組
#include "stdio.h" typedef unsigned char u_char;//windows 中 是 byte struct array_s { u_char* startpos; size_t maxlength; size_t size; size_t length; //實(shí)際上存在的最小空間大小個(gè)數(shù) 1 }; typedef struct array_s array_t; array_t* array_create( size_t length, size_t size); void array_destory(array_t * array); void* array_push(array_t* a); array_t* array_create( size_t length, size_t size) { array_t* a; a = (array_t*)malloc(sizeof(array_t)); if (a==NULL){return NULL;} // a->startpos=(u_char*)_aligned_malloc(size*length,16); a->startpos = (u_char*)malloc(size * length); if (a->startpos == NULL) {return NULL;} a->maxlength = length; a->size = size; a->length = 0; return a; } void array_destory(array_t * array) { free(array->startpos); free(array); } void* array_push(array_t* a) { u_char *startpos,*newstartpos; size_t size; if (a->length == a->maxlength) //內(nèi)存使用完了的時(shí)候.... { size = a->maxlength * a->size; newstartpos = (u_char*)malloc(size * 2); if (newstartpos != NULL) { memcpy(newstartpos,a->startpos,size); free(a->startpos); a->startpos = newstartpos; a->maxlength *= 2; }else{ printf("memerror!"); return NULL; } } //正常的,在范圍內(nèi)的array...... newstartpos = (u_char*)a->startpos + a->length * a->size; // 往后面偏移一位 ..... a->length++; return newstartpos; //返回新的,下一個(gè)元素的存放位置...... } dump(array_t * a) { int tmp=0; for(size_t i=0;ilength;++i) { memcpy(&tmp,(a->startpos + i*a->size),a->size);//只能通過這樣子,將4個(gè)字節(jié)的內(nèi)存轉(zhuǎn)為整數(shù) printf("%d-->%x,size=%d,value_is:%d ",i,a->startpos + i*a->size,a->size,tmp); } } typedef struct{ int length; char* data; } string; dump1(array_t * a) { string* tmp; for(size_t i=0;i length;++i) { tmp = (string*)(a->startpos + i*a->size); printf("%d-->%x,size=%d,value_is : %s,strlen=%d ",i,a->startpos + i*a->size,a->size,tmp->data,tmp->length); } } int main(int argc,char ** argv) { array_t * myarray = array_create(10,sizeof(int)); int* tmp=0; for(int i = 200 ; i< 228 ; ++i) { tmp=array_push(myarray); *tmp = i * i; } dump(myarray); array_t * myarray1; string* tmp1; char tmp2[255]="111"; for(int i=0; i< 3;++i) { myarray = array_create(10,sizeof(string)); for(int i=0; i< 9;++i) { tmp1 = (string*)array_push(myarray); sprintf(tmp2,"---%d---",i); tmp1->data = malloc(strlen(tmp2)+1); //這里調(diào)試花了好長(zhǎng)時(shí)間, 是因?yàn)椋?沒有給字符串指針分配內(nèi)存空間, 就往字符串指針里面復(fù)制內(nèi)容, 導(dǎo)致堆溢出。 if (tmp1->data == NULL){printf("error!");} memset(tmp1->data,"