我有一个问题,包括指针,内存和创建列表节点:
我有以下结构:
typedef struct node {
int data;
struct node *next;
} node;
使用以下函数创建一个(新)节点
static node *createNewNode(int data) {
node *nodePtr = queuer.lastNode;
if (queuer.lastNode == NULL) {
nodePtr = malloc(sizeof(*nodePtr));
nodePtr->data = data;
} else {
nodePtr->next = malloc(sizeof(*nodePtr));
nodePtr = nodePtr->next;
nodePtr->data = data;
}
return nodePtr;
}
所以在每个新节点中我都放了一个整数。创建新节点后,我打印存储的整数,似乎没问题(虽然我还没有循环链接列表)。但我也打印指针,我不明白为什么它看起来像这样:
打印nodePtr
printf("data: %d", nodePtr);
如果我创建了六个节点,输出如下:
205888
206032
216056
216072
216088
216104
而且我不明白为什么内存地址的跳跃在两个第一个节点之间是如此之大,那就是差值为144.之后差异是恒定的,即16
所以我的问题是:这是正常的还是我在代码中做错了什么?
编辑到帖子:我已经创建了另一个打印链表的功能,一切都很好。
答案 0 :(得分:1)
我在那里看到一个错误,当你添加一个节点时,你应该这样做:
nodePtr = nodePtr->next;
nodePtr->data = data;
nodePtr->next = NULL;
添加nodePtr-> next = NULL如果您不知道它包含多少元素,您是否允许遍历该列表。
除此之外没有任何错误,因为您无法预测将在堆中创建节点的位置。您可能在头节点之后和添加其他节点之前分配了一些内容。
答案 1 :(得分:1)
地址值变化的答案很复杂。 malloc函数可能使用每个malloc额外的8个字节来记录分配的大小和指向下一个块的指针。 144字节的跳转可能是因为另一个malloc块阻碍了。