2014-08-27 80 views
0

我正在寫一個應用程序,並通過指向調用函數傳遞一個動態創建的數組有問題。C通過指針傳遞動態數組(分段錯誤)

我在main中創建一個指針,以包含動態生成的數組,以及一個int來包含該數組的長度。我將這些傳遞給readNDEF()函數。它根據所需內存的讀取分配內存,並將字節讀入生成的數組中。

其次很多答案安寧這裏就類似的問題,但沒有似乎解決它,的給其他錯誤(如棧溢出)

int main(void) { 
    uint8_t *recordPTR; //creating pointer 
    uint8_t length=0; //creating length variable 

    readNDEF(recordPTR, &length); 

    int i; 
    for (i=0;i<1;i++){ 
     printf("%x ",*(recordPTR+i)); //segmentation fault happens here 
    } 
} 


bool readNDEF(uint8_t *messagePTR, uint8_t *messageLength){ 

    int NDEFlength; 
    if(!(NDEFlength=getNDEFmessageLength())<0){ //get length 
     closeSession(); 
     return false; 
    } 
    uint8_t tempLength=0x00|NDEFlength; 

    messagePTR = malloc(tempLength*sizeof(uint8_t)+5); //+5 overhead for the rest of the frame 

    if(messagePTR == NULL){ //check if mallok ok 
     return false; 
    } 

    if(!ReadBinary(0x0002, (uint8_t)0x00|NDEFlength, messagePTR)){ //read NDEF memory 
     closeSession(); 
     return false; 
    } 
    messagePTR++; //skip first byte in the array 
    closeSession(); 
    *messageLength = tempLength; 

    //print the array (Works, data correct) 
    int i; 
    for (i=0;i<tempLength;i++){ 
     printf("%02x ",*(messagePTR+i)); 
    } 

    return true; 
} 

長度回報像它應該,但數組本身時在for循環中枚舉它會導致分段錯誤。使用其他方式我可以枚舉它沒有錯誤,但數據不正確(隨機數據)可能是因爲它從函數返回後超出範圍。

回答

1

您的readNDEF方法爲該方法內的對象分配內存(因爲類型指針的參數與C中的其他參數一樣,是按值傳遞的)。因此,外部指針沒有改變,並且在該函數中分配的內存丟失了(內存泄漏)。你需要一個指針傳遞到指針,以達到你想要什麼:

bool readNDEF(uint8_t **messagePTR, uint8_t *messageLength){ 
/// 
*messagePTR = malloc(tempLength*sizeof(uint8_t)+5); 
} 

,並相應地稱之爲:

readNDEF(&recordPTR, &length); 
+0

,以前試過,但可能已經忘記了指針在如果(! ReadBinary(0x0002,(uint8_t)0x00 | NDEFlength,* messagePTR))所以它不工作 – Thomas 2014-08-27 13:25:14

+0

不客氣,進一步成功:) – Ashalynd 2014-08-27 15:57:56