这段指针密集的C代码是做什么的?

3

有人能解释一下以下两行代码应该做什么吗:

s.httpheaderline[s.httpheaderlineptr] = *(char *)uip_appdata;
++((char *)uip_appdata);

这是从微控制器的uIP代码中摘取的。
s - 结构体
httpheaderline - 表示为字符串的Http数据包
httpheadrlineptr - 整数值
uip_appdata - 接收到的以太网数据包(字符串)
如果需要更多信息,请告知。
顺便说一下,Eclipse在第二行上报了一个错误,信息为“Invalid lvalue in increment”,所以我正在努力解决这个问题。

1
它从数据包中复制一个字符,然后将数据包指针移动到下一个字符,这种方式似乎不符合C标准。 - n. m.
错误信息来自于赋值语句左侧的强制类型转换不被允许。我认为这样应该没问题:uip_appdata = ((char *)uip_appdata) + 1; - Imre Kerr
我以为它会做那样的事情,但是这个 *(char *) 有点让我困惑? - justRadojko
你可以尝试像这样修复它 ++(*((char **)&uip_appdata));,但是需要对该片段进行完全重写。 - n. m.
如果uip_appdata是一个array或者const,或者是一个处理只有对齐地址的指针(指向对象),那么你可能会遇到问题。(看起来它是一个unsigned int类型的指针) - Mohit Jain
*(char *) 的意思是“解除引用以下被解释为 char 指针的值”。 - n. m.
1个回答

2
第一行的意图是获取由指向的字符:
*(char *)uip_appdata

uip_appdata 转换为 char*,然后对其进行解引用操作,以获取第一个字符。
第二行尝试增加 uip_appdata 的值。问题在于,它没有正确地执行此操作,因为强制转换的结果无法“原地”增加。
以下是一种可行的方法:
char *tmp = uip_appdata;
uip_appdata = ++tmp;

使用这段代码片段,编译器可以在平台需要时处理指针类型之间的转换。

以下是一个关于这个概念的演示


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接