簡體   English   中英

了解動態 memory 分配

[英]Understanding dynamic memory allocation

我是 C 編程的初學者。 最近有人教我如何使用malloc ,但我認為我不太了解它。 就像事實上為什么它需要一個void *或任何類型轉換? 為什么語法本身在void *malloc(size_t size)中有(void *) ) 。 分配給malloc function 的變量如何知道 memory 塊從哪里開始? malloc function 在分配 memory 塊后是否返回地址或其他內容?

在 class 我們的教授給了我們這個程序。 我也了解 2d memory 分配的工作原理。

#include<stdio.h>
#include<conio.h>
void main(void)
{
    int *studentInfo=NULL,i=1,j=10,k=0,l=0;
    //int *studInfo[10];
    int memLoc=0;
    clrscr();

    printf("How many Student Information You want to store:");
    scanf("%d",&j);
    printf("How many Subject Marks per student You want to store:");
    scanf("%d",&k);
    studentInfo=(int *)malloc(j*k*sizeof(int));

    //memLoc=0;
    for(l=0;l<j;l++)
    {
        printf("Enter Marks for %dth Student",l+1);
        for(i=0;i<k;i++)
        {
            printf("\nEnter Marks for Subject %d:",i+1);
            scanf("%d",studentInfo+(l*j)+i);
        }
    }
    //3 students and 3 subjects
    //memory allocated=3*3*2=18
    //0,1,2 student 0*no of students
    //3 4 5 student 1
    //6 7 8 student 2

    printf("\nInformation you Entered\n");
    for(l=0;l<j;l++)
    {
        printf("Makrs of Student %d:",l+1);
        for(i=0;i<k;i++)
            printf("\t%d",*(studentInfo+(l*j)+i));
        printf("\n");
    }

    //*(studentInfo)=10;
    //*(studentInfo+1)=20;
    //*(studentInfo+2)=30;
    //printf("%d\n",sizeof(studentInfo));
    //printf("%d\n",*(studentInfo));
    //printf("%d\n",*(studentInfo+i++));
    //printf("%d\n",*(studentInfo+i++));


    free(studentInfo);
    getch();
}

在此我們為studentInfo指針分配 malloc function 對嗎? 那么... studentInfo怎么知道 memory 塊的地址是美國而不是南極洲? 而且我知道用其他數據類型對 malloc 進行類型轉換不是一個好習慣。 但是為什么(int *) 為什么 malloc 需要指針?? 如果 malloc 需要一個指針,這意味着它正在返回一個地址,對嗎? 我問我的朋友這個問題,他說沒有 malloc 不會返回任何東西。 還有一件事是我們需要將類型轉換放在括號中嗎?

請用非常簡單的術語解釋。 謝謝你。

為什么語法本身在 void *malloc(size_t size) 中有 (void *)。

因為malloc是 function 並且函數具有返回類型。 這表明此 function 返回此特定類型。 所以(void *)意味着malloc返回一個void *

malloc function 在分配 memory 塊后是否返回地址或其他內容?

Malloc 將指定大小的 memory 分配到堆中,並返回指向已分配 memory 的指針。

在此我們為 studentInfo 指針分配 malloc function 對嗎? 那么... studentInfo 怎么知道 memory 塊的地址是美國而不是南極洲?

不完全是。 studentInfo未分配malloc function 但studentInfo指向malloc返回的指針。 這是studentInfo現在指向分配的 memory。

為什么 malloc 需要指針??

malloc不需要指針。 它將您要分配的 memory 的數量作為參數。

您不需要在這里進行類型轉換,因為void *會自動提升。

還有一件事是我們需要將類型轉換放在括號中嗎?

是的,這就是類型轉換的語法。 沒有括號會導致編譯錯誤。

malloc returns void* because malloc allocates not only int , it can allocate floats, doubles even structures etc. Reason of returning pointer is because it can allocate so much memory in heap, heap is larger than stack and if allocated memory is so big for stack你會收到一個錯誤(可能是stackoverflow)+復制memory如果我們可以復制它的地址並通過指針引用它是沒有意義的。 void *是一種特殊的類型,無論它是什么類型的地址,都可以分配。 是的,你需要轉換它,如果你不這樣做,那么編譯器會給你一個錯誤

malloc function 調用分配一塊studentInfo大到足以容納j*k int對象並返回該塊的第一個元素的地址,給我們分配了這樣的地址值:

             int *       int
             +–––+       +–––+
studentInfo: |   | ––––> |   |
             +–––+       +–––+
                         |   |
                         +–––+
                          ...

因此, studentInfo指向(存儲地址)該序列中的第一個int object。

代碼中malloc調用之前的(int *)是一個強制轉換- 這意味着“將以下表達式的結果(由malloc返回的值)視為int *或指向int的指針。”

只有兩種情況必須malloc的結果:

  • 您正在將代碼編譯為 C++;
  • 您正在使用古老的 K&R C 編譯器;

與 C 不同,C++ 不允許將void *直接分配給其他指針類型。

此外,在 C89 標准之前, malloc返回char * ,因此需要進行強制轉換才能將結果分配給任何其他指針類型。

否則,通常最好不要投射結果 - 這可能會導致維護問題。 寫成這樣會更干凈一些

studentInfo = malloc( sizeof *studentInfo * j * k );

由於studentInfo的類型是int * ,所以表達式*studentInfo的類型是int ,所以sizeof *studentInfo的結果與sizeof (int)相同。

請記住, sizeof是一個運算符,而不是 function - 僅當操作數是類型名稱時才需要括號。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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