1 
                    
                    MeteorCat      2018-09-04 19:33:56 +08:00 via Android 
                    
                    char 指针默认指向首位,+3 位移三位 
                 | 
            
     2 
                    
                    May725      2018-09-04 19:38:03 +08:00 via iPhone 
                    
                    楼上正解,可以搜索下指针的运算 
                 | 
            
     3 
                    
                    harry890829      2018-09-04 19:46:05 +08:00 
                    
                    c 语言的话,主要是有个结构体内存对其的东西,所以你可以通过 data 做减法之后,获得结构体之前的变量。 
                 | 
            
     5 
                    
                    yanggis   OP 谢谢各位回复。现在我碰到这个问题:就是在第一个代码: 
                ret = http_protocol->parse_packet(buf->data + 3 + abuf->len, buf->len - 3 - abuf->len, &hostname); 执行之后,我还想把字符串指针移回原来的位置,解析数据包的 path 变量,代码是这样: pathret = http_protocol->parse_path(buf->data - 3 - abuf->len, buf->len - 3 - abuf->len, &hostname); 这个时候就直接报 segmentation fault 崩溃了。按说上面函数执行之后,我用 buf->data - 3 - abuf->len 是把指针又移动回了原来的位置啊,然后获取同样 buf->len - 3 - abuf->len 长度的数据,为什么会崩溃呢?  | 
            
     6 
                    
                    wevsty      2018-09-04 20:08:34 +08:00 
                    
                    @yanggis  
                要想知道具体的含义,得知道 parse_path 这个函数是干嘛的,几个参数都是什么东西,返回值是什么东西。 没有上下文的基础上只能给你语义层面的回答。 得到 segmentation fault 有可能是 parse_path 函数内部对 buf->data - 3 - abuf->len 这个地址上的内容做了什么操作,比如直接 free 掉了。  | 
            
     7 
                    
                    angryRabbit      2018-09-04 20:13:14 +08:00 
                    
                    buf->len - 3 - abuf->len。这就相当于 x-3-y。 
                buf->len 这叫 dereference,说明 buf 是个指针! buf 如果是 struct,需要用点号  | 
            
     8 
                    
                    linshuang      2018-09-12 10:23:44 +08:00 
                    
                    parse_packet(buf->data + 3 + abuf->len, buf->len - 3 - abuf->len, &hostname) 
                第一个参数为指向 buf 里 data 的第 p 个( p 为 3+abuf 的长度)字符的指针,也就是取 data 的后一部分。 第二个参数就是 buf 这个串长减 p,差不多是从 p 位置开始剩余的数据长度,也就是定 data 后一部分的长度。 如果看成 string (当然并不是)那么对应更高级语言里的 subString  |