簡體   English   中英

動態內存分配和傳入功能

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM