我正在遍历一个节点列表,其中有两个字段:next和size。代码中出现了一个点,我需要链接到一个新节点,但我遇到了问题。我找到了代码seg的错误位置,它看起来是这样的。注意,curr是列表中的当前节点,接下来我需要在curr和curr->之间进行临时链接。
Node* temp = NULL;
temp = ((curr + 1) + a_memory_offset_int); //calculate the address where temp should go
temp->next = curr->next; //Seg faults here
temp->size = some_other_int; //Seg faults here as well
curr->next = temp;
有没有什么方法可以让我为NULL节点设置字段?语法有问题吗(因为我相信逻辑是正确的)?
如果没有看到更多的代码,我怀疑您可能不了解a_memory_offset_int
在做什么。它正在做与+ 1
完全相同的事情,也就是说它正在做指针运算。此:
temp = ((curr + 1) + a_memory_offset_int);
相当于:
temp = (Node*)(((char *)curr + 1*sizeof(Node)) + a_memory_offset_int*sizeof(Node));
你可能真正想要的是:
temp = (Node*)(((char *)curr + 1*sizeof(Node)) + a_memory_offset_int);
注意,唯一的区别是a_memory_offset_int
与sizeof(Node)
的乘积。更简单地说,这就是你想要的:
temp = (Node*)((char *)curr + a_memory_offset_int) + 1;
链表节点的内存地址其实并不重要——你不应该自己计算它,而是调用malloc,然后将其链接进来。
更像这样的东西:
Node* temp = NULL;
temp = malloc(sizeof(Node)); // create a new node, allocating fresh memor
temp->next = curr->next; // should be fine now...
temp->size = some_other_int;
curr->next = temp;
用于验证指针算术的示例程序。
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int size;
struct node * next;
} Node;
int main() {
void *memory = malloc(10*sizeof(Node));//allocate of Node * 10
Node *curr = memory;
Node *temp = NULL;
temp = curr + 1;
temp->size = 999;
printf("%lun", sizeof(Node));
//16
printf("%p,%pn", (void*)curr, (void*)temp);
//00000000004D67B0,00000000004D67C0 <- difference is 16
int a_memory_offset_int = 16;
temp = curr + a_memory_offset_int;
if(temp > &curr[9])//curr[9] is last element
printf("It is outside the allocated memoryn");//this display
temp = curr + a_memory_offset_int/sizeof(Node);
printf("%dn", temp->size);//999
return 0;
}