将char *转换为char **

时间:2012-10-17 04:59:42

标签: c casting

我很难理解下面这段代码:

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

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

1 个答案:

答案 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[];
 };