我很难理解下面这段代码:
int stride = 512;
int max_len = 1024 * stride;
char *addr = (char *)malloc(max_len);
for (int i=stride; i<max_len; i += stride)
*(char **)&addr[i-stride] = (char*)&addr[i];
*(char **)&addr[i-stride] = (char*)&addr[0];
看代码似乎是在尝试创建某种循环链接列表。但我不知道这些演员实际上在做什么。
答案 0 :(得分:5)
恕我直言,你提出的代码很差。
*(char **)&addr[i-stride] = (char*)&addr[0];
将指针addr
带到一个动态分配的区域(右侧部分(char*)&addr[0]
本来可以编写addr
更简单),然后将该地址复制到内存位于addr[i-stride]
位置。
这实际上可能是错误的(未定义的行为),例如当&addr[i-stride]
(可以写成addr+i-stride
)在某些处理器上没有字对齐时。在您的情况下,i
恰好是max_len
,而stride
恰好是512,因此地址是字对齐的(因为malloc
给出了一个良好对齐的区域)。
代码的原作者或许应该声明struct
(或者可能是union
),例如。
struct buffer_st {
struct buffer_st* next;
char content[];
};