2013-05-07 82 views
0

具有以下的基准,返回一个指针或用C

struct node{ 
    int value; 
    struct node *next; 
}; 

typedef struct node Node; 
typedef struct node *pNode; 

Node newNode(){ 
    Node n; 
    n.value = 5; 
    return n; 
} 

pNode newpNode(){ 
    pNode pn = (pNode) malloc(sizeof(Node)); 
    pn->value = 6; 
    return pn; 
} 

我读的地方,如果内存释放是由呼叫用户函数来完成,应该使用newpNode(),以及以其他方式使用newNode( ),但这并不足以帮助我理解。

你能给我一些什么时候应该使用newNode()和newpNode()的具体例子吗?

编辑:忘了里面的pn newpNode()

+0

您不需要在C程序中投射'malloc'的返回类型。 – 2013-05-07 03:44:04

回答

2

在这个简单的例子,没有强烈需要使用一个比其他。

当您调用newNode()时,调用函数以存储从调用返回的节点的大小(在调用堆栈上)时分配内存。该内存可以被分配给一个变量,你会保持它周围(调用堆栈上的内存将memcpy'd到本地变量):

Node n = newNode(); 

然而,作为一个节点变得更为复杂,你会遇到问题。例如,如果您有嵌套的数据结构,这些数据结构不会被复制,并且可能会在newNode()清除时被销毁。另外,由于节点所需的内存变大(即更多字段),因此在堆栈上需要越来越多的内存来进行这些调用。这可以限制诸如递归之类的事情,或者只是一般的效率。

要处理这些限制,请在newPNode()中的堆上分配内存。无论节点的大小如何,这总是返回一个指针。但是,您必须确保您在以后明确地清理该内存,否则将发生内存泄漏。

+0

IIRC,OK从函数返回C中的struct# – 2013-05-07 04:02:17

+0

_例如,如果您有嵌套的数据结构,它们将不会被复制,并可能在newNode()清理完成时被销毁._ This清除了很多。所以这就是为什么你总是使用指向下一个节点的指针,而不是实际的节点,对吧?因为创建新节点并将其分配到最后位置的功能也可能会破坏它? 编辑:参考 - >实际节点 – 2013-05-07 04:03:03

+0

这里的每个人都很困惑,为什么你继续使用“参考”一词。 C没有参考。 C有实际的数据结构和指针。你在链表中使用指针的原因是你不知道它会持续多长时间,所以你不能预先分配空间(如果你这样做的话,那实际上只是一个数组)。 – xaxxon 2013-05-07 04:04:40