[英]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
函數。
*nbr = *(nbr + i);
您更改數組的第一個元素的值。 我想你想做m = *(nbr + i);
是不是 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.