2010-04-25 119 views
0

在對strncpy的調用中出現segfaults後面的代碼,我看不到我做錯了什麼。我需要另一雙眼睛來看這個。基本上,我試圖分配一個指向struct的指針數組元素指向的結構的內存。將指針傳遞給struct C中的函數的問題

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#define MAX_POLICY_NAME_SIZE 64 
#define POLICY_FILES_TO_BE_PROCESSED "SPFPolicyFilesReceivedOffline\0" 

typedef struct TarPolicyPair 
{ 
    int AppearanceTime; 
    char *IndividualFile; 
    char *FullPolicyFile; 
} PolicyPair; 


enum { 
    bwlist = 0, 
    fzacts, 
    atksig, 
    rules, 
    MaxNumberFileTypes 
    }; 


void SPFCreateIndividualPolicyListing(PolicyPair *IndividualPolicyPairtoCreate) 
{ 
    IndividualPolicyPairtoCreate = (PolicyPair *) malloc(sizeof(PolicyPair)); 
    IndividualPolicyPairtoCreate->IndividualFile = (char *)malloc((MAX_POLICY_NAME_SIZE * sizeof(char))); 
    IndividualPolicyPairtoCreate->FullPolicyFile = (char *)malloc((MAX_POLICY_NAME_SIZE * sizeof(char))); 

    IndividualPolicyPairtoCreate->AppearanceTime = 0; 
    memset(IndividualPolicyPairtoCreate->IndividualFile, '\0', (MAX_POLICY_NAME_SIZE * sizeof(char))); 
    memset(IndividualPolicyPairtoCreate->FullPolicyFile, '\0', (MAX_POLICY_NAME_SIZE * sizeof(char))); 
} 

void SPFCreateFullPolicyListing(SPFPolicyPair **CurrentPolicyPair, char *PolicyName, char *PolicyRename) 
{    
    int i; 

    for(i = 0; i < MaxNumberFileTypes; i++) 
    { 
     CreateIndividualPolicyListing((CurrentPolicyPair[i])); 
     // segfaults on this call 
     strncpy((*CurrentPolicyPair)[i].IndividualFile, POLICY_FILES_TO_BE_PROCESSED, (SPF_POLICY_NAME_SIZE * sizeof(char))); 

    } 
} 

int main() 
{ 
    SPFPolicyPair *CurrentPolicyPair[MaxNumberFileTypes] = {NULL, NULL, NULL, NULL}; 
    int i; 

    CreateFullPolicyListing(&CurrentPolicyPair, POLICY_FILES_TO_BE_PROCESSED, POLICY_FILES_TO_BE_PROCESSED); 

    return 0; 
} 
+1

當您發佈代碼時,請將其縮進四個字符以使其格式正確。 – 2010-04-25 18:17:34

回答

0
void SPFCreateIndividualPolicyListing(PolicyPair *IndividualPolicyPairtoCreate) 
{ 
    IndividualPolicyPairtoCreate = (PolicyPair *) malloc(sizeof(PolicyPair)); 

這只是分配給本地IndividualPolicyPairtoCreate變量 - C是傳值,而不是通過引用傳遞。您正在泄漏內存,並且調用者不會看到您傳入的結構發生任何更改。

將該函數更改爲例如返回新分配的內存,並且代替

CreateIndividualPolicyListing((CurrentPolicyPair[i])); 

CurrentPolicyPair[i] = CreateIndividualPolicyListing(); 
+0

感謝您的幫助 – user325490 2010-04-25 19:08:17

1

問題是在函數原型:

... 
void SPFCreateIndividualPolicyListing(PolicyPair *IndividualPolicyPairtoCreate) 
{ 
... 

功能得到一個NULL指針值,將它設置爲malloc有效的位置,但不以任何方式將其返回給調用函數。 應該

... 
void SPFCreateIndividualPolicyListing(PolicyPair **IndividualPolicyPairtoCreate) 
{ 
*IndividualPolicyPairtoCreate = malloc (...); 
... 
+1

更改函數以返回分配的指針更具慣用性。即,PolicyPair * SPFCreateIndividualPolicyListing(void)'。 – 2010-04-25 19:22:23

0

因爲我不能用它過長的變量和函數名讀你的代碼,我已經重寫有問題的功能如下。所以,我的第一個建議是:使用較短的變量名稱。

void create_policies(SPFPolicyPair **policies, char *name, char *newname) { 
    int i; 
    for(i = 0; i < MaxNumberFileTypes; i++) { 
     create_policy(policies[i]); 
     strncpy((*policies)[i].IndividualFile, POLICY_FILES_TO_BE_PROCESSED, SPF_POLICY_NAME_SIZE); 

    } 
} 

該代碼有多個問題。

首先,正如其他人所指出的那樣,create_policy(policies[i])不能改變的policies[i]值,因爲C純粹是按值傳遞。將其寫爲

polices[i] = create_policy(); 

並更改create_policy返回它分配的策略對的地址。

二,(*policies)[i].IndividualFile是錯的。它應該是

(*policies[i]).IndividualFile 

甚至更​​好

policies[i]->IndividualFile. 

第三,你不使用namenewname。問題(1)和(2)都會導致段錯誤。問題(3)表明你一直試圖去掉這段代碼來理解段錯誤,或者你不確定這個函數應該做什麼。


本文的其餘部分將更詳細地解釋第二個錯誤及其修復。

您已正確傳入policies作爲指向數組SPFPolicyPair *的第一個元素的指針。所以,很不客氣地

policies --> [ ptr0 | ptr1 | ptr2 | ... ] 

每個ptri值是SPFPolicyPair *。有兩種方法來解釋這樣一個值:(a)一個SPFPolicyPair對象數組的基數,或者(b)一個指向單個這樣的對象的指針。語言本身並不關心你使用哪種解釋,但在你的情況下,通過查看你如何初始化policies數組,很明顯情況(b)。

那麼,如何評價((*policies)[i]).IndividualFile出問題了?

  • *policies從上圖中返回ptr0
  • 該值現在被下標爲ptr0[i]

的麻煩的第一個跡象是,你只使用以往policies[0],然後處理此值,ptr0,作爲指針以全尺寸的策略對對象的數組的第一個元素,例如,

ptr0 -> [ ppair0 | ppair1 | ppair2 | ... ] 

這是您正在建立索引的數組。除了ptr0未指向策略對對象的序列外,它指向了恰好一個這樣的對象。因此,只要i大於零,您就會關閉未定義的內存。

訂正表達,policies[i]->IndividualFile,這樣工作的:

  • policies[i]相當於*(policies + i),並返回ptr0ptr1一個等
  • ptri->IndividualFile相當於(*ptri).IndividualFile,並返回該基地址i策略對的文件名稱。