在 C 中将另一个指针分配给该内存后如何删除指针?

问题描述 投票:0回答:1
#include <stdio.h>
#include <stdlib.h>

int main (void)
{
    typedef struct node
    {
        int number;
        struct node *next;
    }node;

    // create the pointer to the main list
    node *list;

    // allocate memory for temporary pointer
    node *n = malloc(sizeof(node));

    // assign first element of list
    n -> number = 1;
    n -> next = NULL;

    // have list point to temporary node n
    list = n;
    n -> number = 2;

    printf("%i\n", (list -> number));
}

我是使用指针的新手,我正在尝试做一个练习,但遇到了问题。这个程序打印出2,因为

list
n
指向同一个内存,但是在我将list指向1之后,我想摆脱指针
n
,而不破坏或影响指针
list

list = n;
free(n);

这最终也会影响列表,我不能在不更改列表的情况下再次 malloc

n
。这基本上是我面临的问题,我需要删除指针“n”,同时保持列表完整,这样我就可以
malloc
另一个临时元素,将该元素指向列表,依此类推。 (我刚刚了解链表的概念,提前感谢您的任何建议或帮助)

c pointers linked-list nodes cs50
1个回答
0
投票

有很多好的评论,但我想我应该对你的代码进行一些重构,以启发你定义指针并引用它们。

#include <stdio.h>
#include <stdlib.h>

typedef struct node
{
    int number;
    struct node *next;
} node;

int main (void)
{
    // Create the pointer to the structures
    node *list, *n, *x;

    // Allocate memory for the initial node
    list = malloc(sizeof(node));
    list -> number = 1;
    list -> next = NULL;

    n = list;                       /* Initialize the node work pointer to the intial node  */

    // Build some node structures and create a short list

    for (int i = 0; i < 9; i++)
    {
        x = malloc(sizeof(node));   /* Allocate memory for the next node in the list        */
        n->next = x;                /* Store the new address in the next address pointer    */
        x->number = n->number + 1;  /* Doing a simple incrementation of the value           */
        x->next = NULL;             /* Setup of the next node address pointer               */
        n = x;                      /* Temporary node pointer is set to the latest node     */
    }

    n = list;
    while (1)                       /* Do a simple display of what data has been created    */
    {
        if (n->next == NULL)
            break;
        printf("Node address: %p  Number: %d  Next address: %p\n", n, n->number, n->next);
        n = n->next;
    }

}

基本上,这里需要思考的是指针声明只是能够保存内存地址的变量(在本例中为“list、n 和 x”)。

并解释您的预期目的是创建包含整数值的节点结构列表,使用简单的“for”循环来构造这样的列表,然后将其列出。

以下是终端的示例输出。

craig@Vera:~/C_Programs/Console/Nodelist/bin/Release$ ./Nodelist 
Node address: 0x555cf4d0b2a0  Number: 1  Next address: 0x555cf4d0b2c0
Node address: 0x555cf4d0b2c0  Number: 2  Next address: 0x555cf4d0b2e0
Node address: 0x555cf4d0b2e0  Number: 3  Next address: 0x555cf4d0b300
Node address: 0x555cf4d0b300  Number: 4  Next address: 0x555cf4d0b320
Node address: 0x555cf4d0b320  Number: 5  Next address: 0x555cf4d0b340
Node address: 0x555cf4d0b340  Number: 6  Next address: 0x555cf4d0b360
Node address: 0x555cf4d0b360  Number: 7  Next address: 0x555cf4d0b380
Node address: 0x555cf4d0b380  Number: 8  Next address: 0x555cf4d0b3a0
Node address: 0x555cf4d0b3a0  Number: 9  Next address: 0x555cf4d0b3c0

再次强调,这不是“这就是你做错或做对的事情”的叙述,而是一个如何设置指针使用的示例,并给你深思熟虑的空间。 另一件需要注意的事情是深入研究关于指针和内存分配使用的书籍或在线教程。

© www.soinside.com 2019 - 2024. All rights reserved.