2017-06-20 43 views
-4

我被赋予了考试这个代码,并在需要局部变量来解释它做什么: (我改变了一些名字,因为源不是英语)指针和

#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->next不再存在。

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

+4

此代码不能编译,请张贴编译代码。你可能没有正确地改变所有的名字。 –

+0

由于这是某种形式的伪代码,而不是真正的C,它是不可能回答的问题。特别是,该函数的缺失返回类型使得任何尝试回答都有所不同。 – Lundin

+0

我想你错过了一些'*'这里:'结构elemSCL未来;指针的' – Gerhardh

回答

2

而可变tmp是一个局部变量,与分配

(*scl)->next = tmp; 

你不(*scl)->next指向变量,而是你刚才复制的tmp的内容(这是位置它指向的地方)变成(*scl)->next

分配后,您有两个指针指向同一内存的两个指针((*scl)->nexttmp)。当函数返回时和tmp超出范围(*scl)->next仍将保持其价值和继续指向相同的内存。

+0

难道你不认为是因为'struct elemSCL'有一个'struct elemSCL'成员而不是'struct elemSCL *',所以当我们创建一个'struct elemSCL'类型的变量时,程序最终会走出内存?我的意思是这也应该是问题之一。 –

+0

@GAURANGVYAS我认为有很多,因为OP的“翻译”中显示的文字错别字。主要观点仍然是,指针被复制,就像变量之间的任何其他赋值一样。 –