簡體   English   中英

如何從函數使用malloc?

[英]How can I use malloc from a function?

我試圖了解malloc的工作方式。 我做了一個程序來搜索一維數組int中的最大元素。

這是代碼。

#include <stdlib.h>
#include <stdio.h>

void largest_element(int *nbr)
{
    int i;
    int n;
    int m;

    i = 1;

    nbr = (int*)malloc(sizeof(nbr) + 8);

    while (i < 8)
    {
        if (*nbr < *(nbr + i))
            *nbr = *(nbr + i);
        i++;
    }
    printf("%d ", *nbr);
}

int main(void)
{
    int i;
    int tab[8] = {11, 2, 4, 5, 9, 7, 8, 1};
    int n = sizeof(tab)/sizeof(int);

    i = 0;

    largest_element(&tab[8]);

    return(0);
}

該程序可以在沒有malloc的情況下工作,但是如何使其與malloc一起工作? 我做錯了什么,為什么我的代碼只給我亂碼?

我認為您迷失了指針和數組,因此您無法正確理解malloc(沒有冒犯,每個學習C的人都會犯同樣的錯誤)。

讓我們來看看您的主要功能。 運行時:

int tab[8] = {11, 2, 4, 5, 9, 7, 8, 1};

您靜態分配8個整數組成的數組,並用數字填充它。

動態等效項為:

int* tab = malloc(sizeof(int) * 8);
tab[0] = 11;
tab[1] = 2;
/// Etc...
tab[7] = 1;

第一件事:數組的第一個元素的索引為0。因此,在您的largest_element函數中, i應該初始化為0而不是1。

原因是,當您處理數組時,您將處理指針。 在您的情況下, tab是指向數組第一個元素的指針。 因此,當您執行tab[3] ,您將獲得數組的第四個元素。

第二件事:當您這樣做時:

largest_element(&tab[8]);

在數組開始之后,將第八個元素發送給函數。 問題是:您不擁有此存儲區! 您只有在tab [7]之前擁有內存。

如果要將完整的數組發送給函數,請使用:

largest_element(tab);

現在,讓我們談談您的largest_element函數。

  1. 您無需在此處調用malloc,因為已經分配了內存
  2. 當你做*nbr = *(nbr + i); 您更改數組的第一個元素的值。 我想你想做m = *(nbr + i); 是不是
  3. 為什么不使用nbr[i]而不是*(nbr + i)

正確實現此功能的方法如下(未經測試):

void largest_element(int *nbr)
{
    int i = 0;
    int max = 0;

    while (i < 8)
    {
        if (max < nbr[i])
            max = nbr[i];
        i++;
    }

    printf("%d ", m);
}

最后,使用malloc涉及在不需要內存時使用free函數釋放內存。

我做錯了什么,為什么我的代碼只給我亂碼?

largest_element(int *nbr) nbr指向main的數組tab (至少,如果您這樣稱呼它: largest_element(tab);而不是這個largest_element(&tab[8]);

然后調用nbr = (int*)malloc(sizeof(nbr) + 8); 現在, nbr指向一些尚未初始化的已分配內存,其中包含垃圾值。 現在,如果您從該內存中讀取數據,則通常會得到垃圾值。

您根本不需要malloc來解決此問題,就像您不需要與浮點數學或文件系統相關的函數來解決此問題一樣。

暫無
暫無

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

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