【问题标题】:Pointers and local variables [closed]指针和局部变量
【发布时间】:2017-11-23 00:10:55
【问题描述】:

我在考试中得到了这段代码,需要解释它的作用: (我改了一些名字,因为来源不是英文)

#include <stdlib.h>

typedef int typeInfoSCL;
struct elemSCL
{
    typeInfoSCL info;
    struct elemSCL* next;
};

typedef struct elemSCL TypeElemSCL;
typedef TypeElemSCL* TypeSCL;

void list_add(TypeSCL *scl, typeInfoSCL e)
{
    TypeSCL tmp = *scl;
    *scl = malloc(sizeof(struct elemSCL));
    (*scl)->info = e;
    (*scl)->next = tmp;
}

int main()
{
    TypeSCL scl1 = NULL;
    list_add(&scl1, 3);
    list_add(&scl1, 5);
    TypeSCL tmp = malloc(sizeof(struct elemSCL));
    tmp->next = scl1;
    list_add(&tmp, 7);
}

我以为既然tmplist_add中的一个局部变量,那么这个说法:

(*scl)->next = tmp;

会不正确,因为调用该方法后,scl-&gt;next 不再存在。

测试证明我错了。为什么会这样?

【问题讨论】:

  • 此代码无法编译,请发布可编译代码。您可能没有正确更改所有名称。
  • 因为这是某种伪代码而不是真正的 C,所以无法回答这个问题。特别是,函数缺少的返回类型对任何回答的尝试都有很大的影响。
  • 我假设你在这里错过了一些*struct elemSCL next;
  • 即使这是来自考试的代码,也请不要养成为指针(如TypeSCL)制作类型别名(使用typedef)的习惯。它混淆了类型的真正含义,使代码更难阅读、理解和维护。
  • 而且在未来可以使用非英文名称的函数或变量。而是专注于尽可能逐字复制代码,或者如果它是文件中的代码,则只需复制粘贴即可。在代码中添加 cmets 来解释非英文名称在不明显时可能代表什么。

标签: c pointers memory-management scope


【解决方案1】:

而变量tmp是一个局部变量,带有赋值

(*scl)->next = tmp;

您不要让(*scl)-&gt;next 指向变量,而是只需将tmp(它指向的位置)的内容复制到(*scl)-&gt;next

赋值后,你有两个指针((*scl)-&gt;nexttmp)都指向同一个内存。当函数返回并且tmp 超出范围时,(*scl)-&gt;next 仍将保留其值并继续指向同一内存。

【讨论】:

  • 你不觉得因为struct elemSCL有一个成员struct elemSCL而不是struct elemSCL *,当我们创建一个struct elemSCL类型的变量时程序最终会耗尽内存吗?我的意思是这也应该是问题之一。
  • @GAURANGVYAS 我认为由于 OP 的“翻译”,显示的代码中有很多错别字。要点仍然存在,指针的复制就像变量之间的任何其他赋值一样。
猜你喜欢
  • 2021-11-11
  • 2011-11-26
  • 1970-01-01
  • 2013-10-03
  • 1970-01-01
  • 2013-04-16
  • 2014-05-14
  • 1970-01-01
相关资源
最近更新 更多