[英]Dynamic memory allocation and passing in function
我分配內存如下。 也試圖在另一個功能中更新它。
int main() {
int* ptr = (int*)malloc(sizeof(int)*3);
ptr[0] = 0;
ptr[1] = 1;
ptr[2] = 2;
modifyArr(&ptr, 2);
}
void modifyArr(int** arr, int arrLen)
{
printf("Before modified\n");
printArray(*arr, arrLen);
for (int i = arrLen; i >= 0; i--)
{
*arr[i] = i; // here is error
}
printf("After modified\n");
printArray(*arr, arrLen);
}
那么如何在另一個函數中修改此數組呢?
萬一我的數組將是固定數組為:
int arr[] = { 0,1,2 };
如何在其他功能中更新它?
數組下標運算符[]
優先級高於指針取消引用運算符*
。 請參閱C中運算符的優先級順序 。 結果,這:
*arr[i] = i;
真正意思:
*(arr[i]) = i;
這意味着您將arr
視為指針數組,而不是指向數組的指針。 結果,您最終會寫到錯誤的位置並調用未定義的行為 。
您需要在*arr
周圍加上括號以獲取所需的內容:
(*arr)[i] = i;
但是,由於您只更新指針指向的內存,而沒有實際修改指針,因此無需傳遞指針的地址。 只需直接將其傳遞:
void modifyArr(int* arr, int arrLen)
{
printf("Before modified\n");
printArray(arr, arrLen);
for (int i = arrLen; i >= 0; i--)
{
arr[i] = i;
}
printf("After modified\n");
printArray(arr, arrLen);
}
並這樣稱呼它:
modifyArr(ptr, 2);
您可能還希望修改printArray
以執行相同的操作。
當您記住兩件事時,帶指針的事情非常簡單-您想獲得什么以及如何獲得它?
在這里您要獲取已分配的連續元素存儲器。 你怎么得到的? 是的,您使用[]
和*
非常正確,但是又有一件事情被稱為優先級。 []
優先級高於*
。 因此,您在需要的地方(*arr)[i]
寫下了這個*(arr[i])
。 首先獲取指針,然后在其上使用[]
獲取元素。
在這里,您已經實現了所謂的未定義行為 。 因為您訪問的內容不是您分配的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.