2014-01-08 116 views
1

我必須在函數中讀取更多元素P. 每次循環創建pElem會更好嗎?變量混淆

dataStr * process(char *start, char *stop, GTree* tree) 
{ 
    while ((cp != NULL) && (cp < nextI)) 
    { 
     //I malloc inside of getPElem function 
     pElem * p = getPElem(cp, dateP, s); 
     free(p); 
    } 
} 

或者我應該更好地初始化P元素並且每次重用它?

dataStr * process(char *start, char *stop, GTree* tree) 
{ 
    pElem * p = malloc(sizeof(p)); 
    while ((cp != NULL) && (cp < nextI)) 
    { 
     fillPElem(p, cp, dateP, s); 

    } 
    free(p); 
} 

如果一個元素會更好,我應該MALLOC這一個功能(功能「進程」被稱爲在循環中太)以外:

dataStr * process(char *start, char *stop, GTree* tree, pElem * p) 
{ 

    while ((cp != NULL) && (cp < nextI)) 
    { 

     fillPElem(p, cp, dateP, s); 

    }  
} 

還是喜歡在裏面的功能,每次第二個例子?

+1

您發佈的兩個第一個片段應該是等效的嗎? – UmNyobe

+0

對我來說,循環中的'malloc'不是非常優化的。如果你只是像緩衝區一樣使用它,你應該只做一個'malloc'。 – jml

+0

是的,所有的片段應該是等效的。 – MaMu

回答

3

如果您不需要pElems壽命比封閉範圍內,就沒有必要在所有的動態分配:

dataStr * process(char *start, char *stop, GTree* tree) 
{ 
    pElem p; 
    while ((cp != NULL) && (cp < nextI)) 
    { 
     fillPElem(&p, cp, dateP, s); 

    } 
} 

(是的,我相信沒有一個CP的,nextI等被定義 - 我只是從問題中複製)。

+0

因此,將它分配給函數之外並將它作爲參數分配會不會更好? – MaMu

+0

如果沒有提示你打算如何使用它,我無法回答。根本沒有一個原始函數在函數外面暴露元素。 – Useless

+0

我根本不需要它。我之所以問這個問題的唯一原因是函數進程在循環中被調用。所以我每次都得到新的pElem p。我想,我也可以在外面初始化它。我真的duno什麼更好,所以爲什麼我問。你的解決方案更加「自然」。 – MaMu