1

我很难理解以下代码:

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];

查看代码,这似乎是在尝试创建某种循环链接列表。但我不知道这些演员实际上在做什么。

4

1 回答 1

5

恕我直言,您提供的代码品味不佳。

*(char **)&addr[i-stride] = (char*)&addr[0]; 正在将指针指向addr某个动态分配的区域((char*)&addr[0]可以编写addr更简单的右侧部分),然后将该地址复制到位于位置的内存中addr[i-stride]

这实际上可能是错误的(未定义的行为),例如,当&addr[i-stride](可以写成addr+i-stride)在某些处理器上不是字对齐时。在您的情况下,i恰好是 512,因此该地址是字对齐的(因为给出了一个对齐良好的区域)。max_lenstridemalloc

代码的原始作者可能应该声明 a struct(或者可能是 a union),例如

 struct buffer_st {
    struct buffer_st* next;
    char content[];
 };
于 2012-10-17T05:06:50.390 回答