3.2.2 ngx_str_t数据结构

在Nginx的领域中,ngx_str_t结构就是字符串。ngx_str_t的定义如下:


typedef struct{

size_t len;

u_char*data;

}ngx_str_t;


ngx_str_t只有两个成员,其中data指针指向字符串起始地址,len表示字符串的有效长度。注意,ngx_str_t的data成员指向的并不是普通的字符串,因为这段字符串未必会以'\0'作为结尾,所以使用时必须根据长度len来使用data成员。例如,在3.7.2节中,我们会看到r->method_name就是一个ngx_str_t类型的变量,比较method_name时必须如下这样使用:


if(0==ngx_strncmp(

r->method_name.data,

"PUT",

r->method_name.len)

{……}


这里,ngx_strncmp其实就是strncmp函数,为了跨平台Nginx习惯性地对其进行了名称上的封装,下面看一下它的定义:


define ngx_strncmp(s1,s2,n)strncmp((const char)s1,(const char)s2,n)


任何试图将ngx_str_t的data成员当做字符串来使用的情况,都可能导致内存越界!Nginx使用ngx_str_t可以有效地降低内存使用量。例如,用户请求"GET/test?a=1 http/1.1\r\n"存储到内存地址0x1d0b0110上,这时只需要把r->method_name设置为{len=3,data=0x1d0b0110}就可以表示方法名"GET",而不需要单独为method_name再分配内存冗余的存储字符串。