我正在编写一个应用程序,并且在通过指向调用函数的指针传递动态创建的数组时遇到了问题。
我在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循环中枚举它时数组本身会产生分段错误。使用另一种方法,我可以在没有错误的情况下枚举它,但数据不正确(随机数据)可能是因为它从函数返回后超出了范围。
答案 0 :(得分:1)
您的readNDEF
方法为该方法内的对象分配内存(因为类型指针的参数与C中的任何其他参数一样,都是按值传递的)。因此,指针外部没有被改变,并且在该函数内分配的内存丢失(内存泄漏)。您需要传递一个指向指针才能实现您想要的目标:
bool readNDEF(uint8_t **messagePTR, uint8_t *messageLength){
///
*messagePTR = malloc(tempLength*sizeof(uint8_t)+5);
}
并相应地调用它:
readNDEF(&recordPTR, &length);