【问题标题】:Pointer to linkedlist randomly changing指向链表的指针随机变化
【发布时间】:2019-05-26 14:27:13
【问题描述】:

对于我的一项学校作业,我必须制作自己的堆栈库和一个 POSTFIX 计算器。 计算器必须使用堆栈库并进行一些计算。

我将两个不同的数字压入我的堆栈。编号 6 和 3。标头应指向最近添加的节点 (LIFO)。所以当添加 6 时:

标题 -> 6 -> NULL

添加 3 时:

标题 -> 3 -> 6 -> NULL

当我在添加“6”后打印标题的值时,这很好。正在打印 6。 但是,当我在添加“3”之前打印标题的值时,它正在打印“3”。当它仍然应该打印 6。

所以总结一下我的问题: 在我的链表中添加另一个节点时,标题突然指向最新的节点,甚至还没有改变它。

通过一些代码和调试结果,您可能会更好地理解我。 顺便说一句:不要介意 typedef,我不喜欢它们。我的老师希望我们使用它。

typedef struct stackObject* pStackObject_t;
typedef struct stackObject
{
    void* obj;
    pStackObject_t next;
} StackObject_t;

typedef struct stackMEta* pStackMeta_t;
typedef struct stackMEta
{
    pStackObject_t stack;
    size_t objsize;
    int numelem; //number of elements
    int handle; //welke stack
    pStackMeta_t next;
} StackMeta_t;

int mystack_push(int handle, void* obj)
{
**DELETED NON RELATED CODE BASED ON FEEDBACK**
    if (currentMeta->handle == handle)
    {
        pStackObject_t newObject = malloc(sizeof(StackObject_t));
        newObject->obj = obj;
        printf("%s%d\n", "Wanting to push int to stack:  ", *(int*)obj);

        //First node
        if (currentMeta->stack == NULL)
        {
            currentMeta->stack = newObject;
            currentMeta->stack->next = NULL;
            printf("%s%d\n", " FIRST Curentmeta->stack pointing to  ", *(int*)currentMeta->stack->obj);
            return 0;
        }
        else
        {
            printf("%s%d\n", "NOT FIRST Currentmeta->stack pointing to ", *(int*)currentMeta->stack->obj);
            newObject->next = currentMeta->stack;
            currentMeta->stack = newObject;
            printf("%s%d\n", "Currentmeta->stack ", *(int*)currentMeta->stack->obj);
            printf("%s%d\n", "Currentmeta->stack->next ", *(int*)currentMeta->stack->next->obj);
            printf("%s%d\n", "Succesful pushed int to stack:  ", *(int*)currentMeta->stack->obj);
            return 0;
        }
    }
return -1;
}

终端:

Created stack with handle: 1 and objsize 4 bytes
Wanting to push int to stack:  6
FIRST Curentmeta->stack pointing to  6
Wanting to push int to stack:  3
NOT FIRST Currentmeta->stack pointing to 3
Currentmeta->stack 3
Currentmeta->stack->next 3
Succesful pushed int to stack:  3

我的单元测试在这段代码中表现良好。我的计算器没有,虽然它是同一个函数调用。

【问题讨论】:

  • 请不要 typedef 指针。这只是信息隐藏......
  • @Aconcagua 这是我老师做的。他给了我们一些基本代码,并希望我们继续这样做。我也不喜欢它,但他不希望对他的代码进行任何更改。
  • 此代码不是minimal reproducible example - 为了完整性,缺少堆栈对象和堆栈元的定义 - 后者与最小化无关,您可以删除 while 循环和 if(句柄)条件和只有一个堆栈。也许你也想看看How to Ask
  • 好的,但是您仍然可以选择不在您自己的代码中使用指针类型定义...
  • @Aconcagua 你在哪里看到我自己的代码中的 typedef?我正在使用我老师的 typedef。

标签: c pointers linked-list stack void-pointers


【解决方案1】:

我发现它的工作效率是 50/50。在另一个程序中使用相同的输入值会产生好的结果。

我把代码改成这样:

 pStackObject_t newObject = malloc(sizeof(StackObject_t));
 newObject->obj = malloc(sizeof(currentMeta->objsize));
 memcpy(newObject->obj, obj, currentMeta->objsize);

现在它工作正常。以前的代码不知何故使用了旧值,而它已经超出了范围。感谢大家的帮助。

【讨论】:

  • 很好,您发现了错误。那就是所有权的问题。我们不知道你是否做了int n = 10; push(&n); n = 12; push(&n);——显然是这样——或者你是否做得正确(每个变量都有单独的变量,或者每个变量都有malloced内存)——这就是为什么拥有一个@如此重要的原因987654321@!对我来说,我看到了你的代码,我很自然地使用 n + m 变量,所以错过了你可能使用单个变量的可能性......
  • 请注意,您现在也必须free 删除列表节点时的内存!!! (如果需要的话,只是为了……)。
  • 啊哈,不用担心程序已经没有内存泄漏了哈哈感谢 valgrind!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-11
  • 1970-01-01
  • 1970-01-01
  • 2013-04-01
  • 2018-07-28
  • 1970-01-01
相关资源
最近更新 更多