s****A 发帖数: 80 | 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] 这两个地方能不能解释一
下? 多谢了! |
v**********9 发帖数: 42 | 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*)。 完全不明白为什么要这么写。
坐等高手指点。 |
n**********e 发帖数: 88 | 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赋值。 |
s********r 发帖数: 403 | 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);
|
t******g 发帖数: 1667 | 5 ST* s;
s->sz = 7;
看到这两句还需要往下看吗? |