将 char* 转换为 char**

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

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

最佳答案

恕我直言,您提供的代码品味很差。

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

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

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

 struct buffer_st {
    struct buffer_st* next;
    char content[];
 };

关于将 char* 转换为 char**,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12927403/

相关文章:

c - 在 C 中执行 Octave 程序

c - malloc.c :3074 error?

java - 在java中使用fromJson时自动转换

c++ - 使用类型转换创建对 unique_ptr 中对象的引用

c - 从 uint8 中提取数据到 double

ios - 是否可以从 tableView :numberOfRowsInSection? 返回 NSUInteger

Java 泛型和转换为原始类型

c# - 从 C# 调用 C

c - 如何有效地将位掩码的对应值获取到整数?

c - 如果我在一个线程中使用 chdir,那会影响父程序的 cwd 吗?