资讯专栏INFORMATION COLUMN

【nginx】nginx 源码学习

Cciradih / 1926人阅读

摘要:新手学习,模拟思想编写程序数组中是实际上存在的最小空间大小个数内存使用完了的时候正常的,在范围内的往后面偏移一位返回新的,下一个元素的存放位置只能通过这样子,将个字节的内存转为整数

新手学习nginx,模拟nginx思想编写程序 nginx 数组
#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; //实际上存在的最小空间大小个数  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) //内存使用完了的时候....
    {
        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;
        }
    }

    //正常的,在范围内的array......
    newstartpos = (u_char*)a->startpos + a->length * a->size; // 往后面偏移一位 .....
    a->length++;
    return newstartpos; //返回新的,下一个元素的存放位置......
}




dump(array_t * a)
{
    int tmp=0;
    for(size_t i=0;ilength;++i)
    {
        memcpy(&tmp,(a->startpos + i*a->size),a->size);//只能通过这样子,将4个字节的内存转为整数
        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;ilength;++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);        //这里调试花了好长时间, 是因为, 没有给字符串指针分配内存空间, 就往字符串指针里面复制内容, 导致堆溢出。
            if (tmp1->data == NULL){printf("error!");}
            memset(tmp1->data,"",sizeof(tmp1->data));
            //printf("====%x,%d
",tmp1->data,i);
            memcpy(tmp1->data,tmp2,strlen(tmp2)+1);
            tmp1->length=strlen(tmp1->data);
        }
        //char* tmp1="111111111111111111111111";
        /* string* tmp2=(string*)myarray->startpos; */
        /* printf("%s
",tmp2->data); */
        /* printf("tmpx=%x,tmps=%s,%x,%s,max:%d,sizeof=%d
",tmp,tmp,tmp1,tmp1,myarray->length,sizeof(char[255])); */
        //tmp1 = array_push(myarray);
        //tmp1="23432412321asfdsfasfasdf";
        //tmp1 = array_push(myarray);
        //tmp="sdafadosifjiodsajfoisdajfoiasdjf";

        dump1(myarray);
        array_destory(myarray);
    }

}
编译
cl array.c
结果

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/39157.html

相关文章

  • 【每日学习记录】使用录像设备记录每天的学习

    摘要:在这里使用学而思网校的录像设备,记录每天学习的内容执行潘森执行潘森执行潘森赵俊峰红黑树景罗红黑树景罗配置三叉树田志泽新建模块马运运配置田志泽田志泽田志泽李乐田志泽田志泽文件系统 在这里使用学而思网校的录像设备,记录每天学习的内容: 2019-07-15 ~ 2019-07-19 07-18 nginx http 执行 by 潘森 07-17 nginx http 执行 by 潘森 07...

    pkhope 评论0 收藏0
  • 【每日学习记录】使用录像设备记录每天的学习

    摘要:在这里使用学而思网校的录像设备,记录每天学习的内容闫昌李乐阶段李乐李乐李乐李乐李乐李乐马运运李乐李乐李乐源码集群闫昌源码闫昌源码主从复制李乐源码施洪宝源码施洪宝韩天 在这里使用学而思网校的录像设备,记录每天学习的内容: 2019-06-24 ~ 2019-06-28 06-27 nginx by 闫昌 06-26 nginx module by 李乐 06-25 nginx http ...

    szysky 评论0 收藏0
  • Nginx源码分析】Nginx配置文件解析(一)

    摘要:本文将从源码从此深入分析配置文件的解析,配置存储,与配置查找。在学习配置文件的解析过程之前,需要先了解一下模块与指令的一些基本知识。 运营研发团队 李乐 配置文件是nginx的基础,对于学习nginx源码甚至开发nginx模块的同学来说更是必须深究。本文将从源码从此深入分析nginx配置文件的解析,配置存储,与配置查找。 看本文之前读者可以先思考两个问题: 1.nginx源码中随处可以...

    JasonZhang 评论0 收藏0
  • nginx系列2----从源码安装nginx和echo-nginx-module模块

    摘要:下面的参数是根据需要在压缩或解压档案时可选的。备注了解过程省略这里添加了模块生成文件使用系统库没有用到库使用系统库这些路径是要了解的这是配置文件 资源1: 官网: http://nginx.org资源2: 官方学习资源,     wiki,     nginx安装之wiki介绍资源3: 编译选项列表资源4: nginx源码下载列表,当前Stable版本是nginx-1.14.0,资源5...

    mylxsw 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<