2017-07-24 87 views
0

清分,填充和操作與指針指針數組構建清分,填充和操縱指針數組與指針來構造

我的測試列表不知道的測試的次數在啓動。 測試次數和每個測試的內容將在稍後來自數據庫。 測試的順序應該很容易改變,測試應該可以單獨刪除/插入順序。

由於我可以確定查詢數據庫的測試數量,我想先分配一個指向所有測試的指針數組,然後爲每個測試分別分配內存。由此我可以通過交換指向測試的指針來重新排序序列,並且還能夠將新測試移除或插入到序列中。

我寫了一個小程序,可以用gdt快速檢查。

不幸的是,編譯器不接受指針數組(也分配mem)的測試(分配的mem)的分配。

#define MAX_TEST_NAME    100 

typedef struct sTestT 
{ 
    char      cTested;        // Output of this Test 
    char      cEnabled;       // 
    char      cName[MAX_TEST_NAME+1]; 
} sTest; 


void main(int argc, char **argv) 
{ 
    printf ("Double Pointer Test for GDB\n"); 

    int i,j; 
    i = 7;            // A random number for this program, to be able to change it with gdb 

    sTest* psTestPtr; 
    sTest* psTestPtrArray; 
    sTest* psTestPtrArrayOriginal; 

    // We first allocate an array of pointers to the Tests, NOT an array of the Tests 
    psTestPtrArray = calloc (i, sizeof(sTest*));  // allocate the pointer array 
    psTestPtrArrayOriginal = psTestPtrArray;   // store original pointer to free memory later 


    // Now we allocate each test seperatly and let the psTestPtrArray point to the test 
    for (j=0; j<i; j++) 
    { 
    // Now we allocate ONE trigger each time to be able to free them seperately 
    psTestPtr = calloc (1, sizeof(sTest)); 
    psTestPtr->cTested = j; 
    *psTestPtrArray = &psTestPtr;     // <-------------- Does NOT compile 
    psTestPtrArray++;        // Next pointer to another Test 
    } 

    // Working with test omitted 

    // Free Tests and pointer array 
    psTestPtrArray = psTestPtrArrayOriginal;   // Restore initial pointer to be able to walk through array 
    for (j=0; j<i; j++) 
    { 
    free (*psTestPtrArray);       // <-------------- Does NOT compile 
    psTestPtrArray++; 
    } 

    free (psTestPtrArray); 
} // main 

有什麼建議嗎?

謝謝。 Rainer

+0

你沒有使用指針數組,雖然你似乎幾乎分配了一個。指針數組包含... *指針*。 – WhozCraig

+0

psTestPtrArray應該有sTest **類型,賦值應該是psTestPtrArray [j] = psTestPtr。就像這樣,由於過於冗長的命名,你的代碼很難閱讀。 –

+1

注意:使用'psTestPtrArray = calloc(i,sizeof(sTest *));'時,需要檢查'psTestPtrArray'是否指向'sTest'。使用'psTestPtrArray = calloc(i,sizeof * psTestPtrArray);',查看時不需要檢查。 – chux

回答

0

您正在聲明錯誤類型的變量。當您分配它們時,您應該有自我解釋錯誤。

sTest* psTestPtr;  //pointer to a sTest 
sTest** psTestPtrArray; //Pointer to an array of pointers to sTest 
sTest** psTestPtrArrayOriginal; //same as above 

而且

*psTestPtrArray = &psTestPtr;  

應該

*psTestPtrArray = psTestPtr; 

因爲psTestPtr已經是一個指向sTest。沒有需要採取其地址。 如果您使用數組索引爲每個sTest分配內存,而不是增加指針變量,它會更容易。

+0

也值得一提。除非'psTestPtrArray'一次又一次恢復爲'psTestPtrArrayOriginal',或者只是使用'psTestPtrArrayOriginal'作爲最終'free'的實際參數,否則最終'free'將調用*未定義行爲*。 – WhozCraig