C++中的结构是按顺序分配内存的吗?每次指针比较都会得到正确的答案
我想解决一个问题 问题定义:给定一个包含n个节点的单链表。修改前半个节点的值,使第一个节点的新值等于最后一个节点的值减去第一个节点的当前值,第二个节点的新值等于最后第二个节点的值减去第二个节点的当前值,同样适用于前半个节点。如果n为奇数,则中间节点的值保持不变。请注意,链表的半个节点保持不变 例:635410 答复: -4-1 5 4 10 我编写了一个程序来跟踪下半部分中的节点,其顺序与使用递归进行处理所需的顺序相反。但是,出于疏忽,我比较了这两个指针,以检查这两个指针是否相互交叉以停止处理它们 我每次都得到正确的输出 完整代码: 有人能告诉我这样比较有效吗 如果这是无效的,它如何通过在线法官的测试案例 有人能告诉我这样比较有效吗 除非指针指向同一数组的子对象或同一对象的成员,否则无法直接比较指针。形式上,不属于同一数组的对象被视为单独的1元素数组的一部分。没有定义用于比较它们的指针的结果。引用N4296: §5.9关系运算符[expr.rel]ְ3 将指针与objects86进行比较的定义如下: 3.1-如果两个指针指向同一数组的不同元素,或 其中的子对象,指向具有较高值的元素的指针 下标比较大。 3.2-如果一个指针指向 数组的元素,或数组的子对象,以及另一个指针 指向数组的最后一个元素,即后一个指针 比较大。 3.3-如果两个指针指向不同的 同一对象的非静态数据成员,或此类对象的子对象 成员,递归地,指向后面声明的成员的指针 如果两个成员具有相同的访问控制,则比较大 第11条,但前提是他们的阶级不是工会 86为此,非数组元素的对象被视为属于单个元素数组;见5.3.1 因此,您无法直接进行比较,并且您的程序正式具有未定义的行为。然而,这样的比较可能很有用,这就是为什么标准为您提供了另一种方法: §20.9.6比较[比较]14 对于模板“更大”、“更小”、“更大”和“更小”,任何指针类型的专门化 生成一个总订单,即使内置运算符=不 因此,只需调用std::greater_equalhead,*left替换head>=*left,就可以很好地定义代码 如果这是无效的,它如何通过在线法官的测试案例C++中的结构是按顺序分配内存的吗?每次指针比较都会得到正确的答案,c++,pointers,recursion,linked-list,C++,Pointers,Recursion,Linked List,我想解决一个问题 问题定义:给定一个包含n个节点的单链表。修改前半个节点的值,使第一个节点的新值等于最后一个节点的值减去第一个节点的当前值,第二个节点的新值等于最后第二个节点的值减去第二个节点的当前值,同样适用于前半个节点。如果n为奇数,则中间节点的值保持不变。请注意,链表的半个节点保持不变 例:635410 答复: -4-1 5 4 10 我编写了一个程序来跟踪下半部分中的节点,其顺序与使用递归进行处理所需的顺序相反。但是,出于疏忽,我比较了这两个指针,以检查这两个指针是否相互交叉以停止处理它
未定义的行为意味着语言规范允许任何结果。工作是一种可能的结果。你不能指望它永远是结果 不,绝对不能保证不同分配的内存的关系位置 如果这是无效的,它如何通过在线法官的测试案例 我最简单的回答就是说你运气不好。事实上,内存分配/映射机制非常复杂,涵盖了更多的层面:应用程序malloc、C库实现、操作系统和硬件。连续的malloc请求返回的内存可能是连续的,在某些情况下甚至可能是连续的。这绝不是一种保证,而且很容易打破,例如,在一系列相互交织的mallocs和free之后
此外,正如@StoryTeller所示,将指针(除相等外)与不同对象进行比较是不正确的。No,绝对不能保证每个连续的mallocd对象的地址都比之前的所有对象晚;你只是“幸运”。你不能相信这一点。否则,请想一想:该库将是一个巨大的内存泄漏,无法从释放的对象中回收内存,因为它将不允许返回较低的地址来分配新的地址。。。此外,包括这意味着要实现什么?你不应该包含这样的标准库片段。如果这是无效的,它如何通过在线法官的测试案例?我不知道这为什么令人困惑。有时事情是按照你第一直觉的预期进行的,即使它们不是必需的。这种指针比较是未定义的行为。只允许比较指向同一数组的指针。不是标准C++,不要使用它。@ N.M。迭代器是如何实现的?您可以将list的迭代器与end迭代器进行比较。下面有什么魔法吗?@zoska你总是可以将指针与==和!=,我
我说的是朋友和朋友。迭代器不必是指针。嘿!这是如何使代码定义良好的?标准::更大的等头,*左。你能详细说明一下吗?@JinxerAlbatross-根据引用段落中的规定,标准对其进行了定义。
#include <bits/stdc++.h>
using namespace std;
struct Node
{
int data;
struct Node* next;
};
struct Node* modifyTheList(struct Node *head);
void push(struct Node **head_ref, int new_data)
{
struct Node* new_node =(struct Node*) malloc(sizeof(struct Node));
new_node->data = new_data;
new_node->next = *head_ref;
*head_ref = new_node;
}
void printList(struct Node *head)
{
if (!head)
return;
while (head->next != NULL)
{
cout << head->data << " ";
head = head->next;
}
cout << head->data << endl;
}
int main()
{
int t;
cin>>t;
while(t--){
int n;
cin>>n;
struct Node *head = NULL;
while(n--){
int a;
cin>>a;
push(&head, a);
}
head = modifyTheList(head);
printList(head);
}
return 0;
}
void modify(Node *head ,Node** left)
{
if(head!=NULL)
{
modify(head->next,left);
if(head >= *left ) //line of concern, comparing pointers
return;
else
{
(*left)->data=(*left)->data-head->data;
(*left)=(*left)->next;
}
}
}
struct Node* modifyTheList(struct Node *head)
{
if(head==NULL || head->next==NULL )
return head;
struct Node *temp = head;
modify(head,&temp);
return head;
}