由於我們不能釋放在函數中定義的本地指針「tmparr」,它會導致內存泄漏嗎?不知道這裏是否有更好的編碼解決方案。從函數返回數組會導致內存泄漏嗎?
我想傳遞一個函數指針,以便它將處理和更改函數內的數據。數據和值的大小可以在函數內靈活修改。
void printArray(int* data,
int length)
{
for (int i=0; i<length; i++) {
if ((i>0) && (i%5==0))
printf("\n");
printf("%d ", data[i]);
}
printf("\n\n");
}
void copyPassPtrArray(int** data,
int length)
{
int* tmparr = (int*)malloc(length * sizeof(int));
for (int i=0; i<length; i++)
tmparr[i] = i + 10;
*data = tmparr;
}
int main()
{
int length = 10;
int* ptrarr = (int*)malloc(length * sizeof(int));
for (int i =0; i <length; i++)
ptrarr[i] = i;
printf("Origin ... \n");
printArray(ptrarr, length);
copyPassPtrArray(&ptrarr, 20);
printf("After copyPassPtrArray ... \n");
printArray(ptrarr, 20);
free(ptrarr);
return 0;
}
閱讀評論之後,我有以下提議的API解決方案。這種做法的目的是我們可能不知道函數中的某些計算後數組的大小和值是多少。它的「數據」需要返回到主或其他功能。但是,有沒有內存泄漏?
void copyGlobalPtrArray(int** data,
int length)
{
*data = (int*)malloc(length * sizeof(int));
for (int i=0; i<length; i++)
(*data)[i] = i + 10;
}
您分配了'ptrarr'內存的兩倍,並且免費只有一次;所以是的,這會導致內存泄漏。 (您也可以嘗試並測量它,例如使用valgrind)。 – Evert 2014-09-23 16:18:40
*如果分配內存的函數未在該函數中釋放(通常不推薦),則從函數中返回該數據,以便在函數調用時指定一個明確的值。這使得它更清晰地釋放變量。 – Evert 2014-09-23 16:20:13
太好了。你的反饋確實啓發了我。謝謝。 – Fusionmate 2014-09-23 16:58:57