【发布时间】:2015-04-10 01:17:21
【问题描述】:
我当然没有理由这样做。假设我很无聊,想探索这是否可能。 :)
假设我想实现一个链表的节点。我当然可以
struct Node {
int val;
Node *prev, *next;
}
但是假设我很无聊,我想做一些事情,比如为一个节点分配一块内存,然后任意决定第一部分是指向前一个节点的指针,中间部分是值,最后一部分是指向下一个节点的指针。是否可行?
我尝试了类似的方法,但它无法运行。
*second = first
特别失败。
void** createNewNode(int val) {
void** p = (void**)malloc(sizeof(int) + 2*sizeof(void*));
*(p+1) = &val;
}
void connectTwoNodes(void** first, void** second) {
*(first+2) = second;
cout << "first assigned!" << endl;
*second = first;
cout << "second assigned!" << endl;
}
int main() {
void** p1 = createNewNode(1);
void** p2 = createNewNode(2);
cout << "both created!" << endl;
connectTwoNodes(p1, p2);
return 0;
}
【问题讨论】:
-
这很棘手,因为您不能确定所有地址都将针对数据类型正确对齐。
-
你不能通过 void 指针间接。您必须将它们转换为适当的类型
-
您可以使用
memcpy从一个指针复制到另一个指针,而不是使用赋值。 -
struct Node { std::string val; Node *prev, *next; };现在,一旦您实际使用 Node.. -
"...那么任意决定第一部分是指向前一个节点的指针,中间部分是值,最后部分是指向下一个节点的指针"。换句话说,您希望将其视为具有元素 prev、val 和 next 的新结构,按此顺序。那么你可以定义新的结构 rearranged_node,将原始 *node 转换为 *rearranged_node,然后复制成员(使用临时,因为你正在原地覆盖)。