我很难理解以下代码:
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];
查看代码,这似乎是在尝试创建某种循环链接列表。但我不知道这些类型转换实际上在做什么。
最佳答案
恕我直言,您提供的代码品味很差。
*(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[];
};
关于将 char* 转换为 char**,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12927403/