求 C 语言大神来解释一下这段代码,脑子笨理解不了。

2018-09-04 19:17:31 +08:00
 yanggis
最近在学习 S-S 的源代码,看到这几行,不知道怎么理解,求大神给解释:
这个是 s/s-local 里面的一段代码,根据包的信息解析出域名的,
代码里面用到了几个 strcture 结构,分别是 buf,abuf, 定义结构如下:

typedef struct buffer {
size_t idx;
size_t len;
size_t capacity;
char *data;
} buffer_t;


就是下面这句没法理解:

ret = http_protocol->parse_packet(buf->data + 3 + abuf->len, buf->len - 3 - abuf->len, &hostname);


这里面的 buf->data + 3 + abuf->len 和 buf->len - 3 - abuf->len 该怎么理解啊?
3708 次点击
所在节点    编程
8 条回复
MeteorCat
2018-09-04 19:33:56 +08:00
char 指针默认指向首位,+3 位移三位
May725
2018-09-04 19:38:03 +08:00
楼上正解,可以搜索下指针的运算
harry890829
2018-09-04 19:46:05 +08:00
c 语言的话,主要是有个结构体内存对其的东西,所以你可以通过 data 做减法之后,获得结构体之前的变量。
yanggis
2018-09-04 19:48:00 +08:00
@MeteorCat 谢谢回复,那 buf->len - 3 - abuf->len 该怎么理解呢?
yanggis
2018-09-04 20:00:56 +08:00
谢谢各位回复。现在我碰到这个问题:就是在第一个代码:
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 长度的数据,为什么会崩溃呢?
wevsty
2018-09-04 20:08:34 +08:00
@yanggis
要想知道具体的含义,得知道 parse_path 这个函数是干嘛的,几个参数都是什么东西,返回值是什么东西。
没有上下文的基础上只能给你语义层面的回答。
得到 segmentation fault 有可能是 parse_path 函数内部对 buf->data - 3 - abuf->len 这个地址上的内容做了什么操作,比如直接 free 掉了。
angryRabbit
2018-09-04 20:13:14 +08:00
buf->len - 3 - abuf->len。这就相当于 x-3-y。
buf->len 这叫 dereference,说明 buf 是个指针! buf 如果是 struct,需要用点号
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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/486118

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX