将char*转换为char**

blu*_*ale 1 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];
Run Code Online (Sandbox Code Playgroud)

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

Bas*_*tch 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[];
 };
Run Code Online (Sandbox Code Playgroud)