【发布时间】: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);
}
我以为既然tmp是list_add中的一个局部变量,那么这个说法:
(*scl)->next = tmp;
会不正确,因为调用该方法后,scl->next 不再存在。
测试证明我错了。为什么会这样?
【问题讨论】:
-
此代码无法编译,请发布可编译代码。您可能没有正确更改所有名称。
-
因为这是某种伪代码而不是真正的 C,所以无法回答这个问题。特别是,函数缺少的返回类型对任何回答的尝试都有很大的影响。
-
我假设你在这里错过了一些
*:struct elemSCL next; -
即使这是来自考试的代码,也请不要养成为指针(如
TypeSCL)制作类型别名(使用typedef)的习惯。它混淆了类型的真正含义,使代码更难阅读、理解和维护。 -
而且在未来可以使用非英文名称的函数或变量。而是专注于尽可能逐字复制代码,或者如果它是文件中的代码,则只需复制粘贴即可。在代码中添加 cmets 来解释非英文名称在不明显时可能代表什么。
标签: c pointers memory-management scope