Redian新闻
>
求问下面这几行代码是做什么的,非常感谢!
avatar
求问下面这几行代码是做什么的,非常感谢!# JobHunting - 待字闺中
s*A
1
struct ST{
int *ptr;
size_t sz;
};
int main(){
ST* s;
s->sz = 7;
s->ptr = (int *)malloc((s->sz)*sizeof(int));
int allocsize = sizeof(ST) + (s->sz)*sizeof(int);
uint8 * buffer = (uint8 *)malloc(allocsize);
int offset = sizeof(ST);
memcpy(& buffer[offset], s->ptr, s->sz*sizeof(int));
*(int **)&buffer[(char*)&(s->ptr)-(char*)s] = (int *)&buffer[offset];
}
我大概知道好像是要分配一块连续的空间把struct和struct里指针指向的数组内容放在
一起,是这样吗?
但是最后一行code谁能讲一下大概什么意思?
特别是*(int **)&buf[...]和 (char*)&(s->ptr)-(char*)s] 这两个地方能不能解释一
下? 多谢了!
avatar
v*9
2
确定这玩意能work吗?
ST* s;
s->sz = 7;
是不是我打开电脑的方式不对?
余下的代码来猜一下。
memcpy(& buffer[offset], s->ptr, s->sz*sizeof(int));
(char*)&(s->ptr)-(char*)s 这个是在计算从地址s->ptr 到地址s相差几个byte. (根
据ST type的声明,应该为0)
*(int**) 应该等同于(int*)。 完全不明白为什么要这么写。
坐等高手指点。
avatar
n*e
3
(char*)&(s->ptr) 是 s 中第一个元素的地址。
(char*)s 是 s的地址.
所以, (char*)&(s->ptr) = (char*)s
所以, (char*)&(s->ptr)-(char*)s = 0
所以, buffer[(char*)&(s->ptr)-(char*)s] = buffer[0]
所以,最后一行:
*(int **)&buffer[(char*)&(s->ptr)-(char*)s] = (int *)&buffer[offset];
就是为s->ptr赋值。
avatar
s*r
4
从上下文看,buffer[(char*)&(s->ptr)-(char*)s] 就是 buffer[0]
但这样做有个好处,就是比较 robust,
一旦以后变成
typedef struct _ST {
void *some_ptr;
int *ptr;
size_t sz;
} ST;
还是可以 work
但可读性不高,不如直接用指针 cast,就一目了然了

【在 s****A 的大作中提到】
: struct ST{
: int *ptr;
: size_t sz;
: };
: int main(){
: ST* s;
: s->sz = 7;
: s->ptr = (int *)malloc((s->sz)*sizeof(int));
: int allocsize = sizeof(ST) + (s->sz)*sizeof(int);
: uint8 * buffer = (uint8 *)malloc(allocsize);

avatar
t*g
5
ST* s;
s->sz = 7;
看到这两句还需要往下看吗?
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。