C通过指针传递动态数组(Segmentation Fault)

时间:2014-08-27 13:16:09

标签: c arrays pointers segmentation-fault malloc

我正在编写一个应用程序,并且在通过指向调用函数的指针传递动态创建的数组时遇到了问题。

我在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 个答案:

答案 0 :(得分:1)

您的readNDEF方法为该方法内的对象分配内存(因为类型指针的参数与C中的任何其他参数一样,都是按值传递的)。因此,指针外部没有被改变,并且在该函数内分配的内存丢失(内存泄漏)。您需要传递一个指向指针才能实现您想要的目标:

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

并相应地调用它:

readNDEF(&recordPTR, &length);