如何从函数中使用malloc?
我试图了解malloc是如何工作的。我做了一个程序,搜索一维数组int中的最大元素 这是代码如何从函数中使用malloc?,c,arrays,int,malloc,dynamic-memory-allocation,C,Arrays,Int,Malloc,Dynamic Memory Allocation,我试图了解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) {
#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);
}
#包括
#包括
最大无效元素(整数*nbr)
{
int i;
int n;
int m;
i=1;
丁腈橡胶=(国际*)马洛克(丁腈橡胶)+8;
而(i<8)
{
如果(*nbr<*(nbr+i))
*nbr=*(nbr+i);
i++;
}
printf(“%d”,*nbr);
}
内部主(空)
{
int i;
int tab[8]={11,2,4,5,9,7,8,1};
int n=sizeof(制表符)/sizeof(int);
i=0;
最大_元素(&表[8]);
返回(0);
}
程序在没有malloc的情况下可以工作,但是我如何才能使它在malloc下工作呢?我做错了什么,为什么我的代码只给我垃圾号?我做错了什么,为什么我的代码只给我垃圾号?? 在
最大元素(int*nbr)
nbr
中指向main
中的数组tab
(至少如果您这样称呼它:最大元素(tab);
而不是像这样最大元素(&tab[8]);
然后调用nbr=(int*)malloc(sizeof(nbr)+8);
nownbr
指向一些分配的内存,这些内存尚未初始化,并且包含垃圾值。现在,如果从该内存中读取,则获得垃圾值是正常的
这个问题不需要
malloc
,就像这个问题不需要浮点数学或与文件系统相关的函数一样。我做错了什么,为什么我的代码只给我垃圾号??
在最大元素(int*nbr)
nbr
中指向main
中的数组tab
(至少如果您这样称呼它:最大元素(tab);
而不是像这样最大元素(&tab[8]);
然后调用nbr=(int*)malloc(sizeof(nbr)+8);
nownbr
指向一些分配的内存,这些内存尚未初始化,并且包含垃圾值。现在,如果从该内存中读取,则获得垃圾值是正常的
这个问题不需要
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。因此,在最大的\u元素
函数中,i
应该初始化为0,而不是1
原因是,当你处理数组时,你处理的是指针。在你的例子中,tab
是指向数组第一个元素的指针。因此,当你处理tab[3]
时,你得到数组的第四个元素
第二件事:当你这样做的时候:
largest_element(&tab[8]);
在数组开始后,您将第八个元素发送给函数。问题是:您不拥有此内存区域!您只拥有该内存直到tab[7]
如果要将完整数组发送到函数,只需使用:
largest_element(tab);
现在,让我们来讨论一下您的最大元素
函数
*nbr=*(nbr+i);
时,您会更改数组中第一个元素的值。我认为您希望执行m=*(nbr+i);
不是吗nbr[i]
而不是*(nbr+i)
void最大元素(int*nbr)
{
int i=0;
int max=0;
而(i<8)
{
如果(最大值
最后一件事,使用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。因此,在最大的\u元素
函数中,i
应该初始化为0,而不是1
原因是,当你处理数组时,你处理的是指针。在你的例子中,tab
是指向数组第一个元素的指针。因此,当你处理tab[3]
时,你得到数组的第四个元素
第二件事:当你这样做的时候:
largest_element(&tab[8]);
在数组开始后,您将第八个元素发送给函数。问题是:您不拥有此内存区域!您只拥有该内存直到tab[7]
如果要将完整数组发送到函数,只需使用:
largest_element(tab);
现在,让我们来讨论一下您的最大元素
函数
*nbr=*(nbr+i);
时,您会更改数组中第一个元素的值。我认为您希望执行m=*(nbr+i);
不是吗nbr[i]
而不是*(nbr+i)
void最大元素(int*nbr)
{
int i=0;
int max=0;
而(i<8)
{
如果(最大值
最后一件事,使用malloc包括在执行此操作时使用函数释放内存