如何从函数中使用malloc?

如何从函数中使用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) {

我试图了解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);
}
#包括
#包括
最大无效元素(整数*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);
now
nbr
指向一些分配的内存,这些内存尚未初始化,并且包含垃圾值。现在,如果从该内存中读取,则获得垃圾值是正常的


这个问题不需要
malloc
,就像这个问题不需要浮点数学或与文件系统相关的函数一样。

我做错了什么,为什么我的代码只给我垃圾号??

最大元素(int*nbr)
nbr
中指向
main
中的数组
tab
(至少如果您这样称呼它:
最大元素(tab);
而不是像这样
最大元素(&tab[8]);

然后调用
nbr=(int*)malloc(sizeof(nbr)+8);
now
nbr
指向一些分配的内存,这些内存尚未初始化,并且包含垃圾值。现在,如果从该内存中读取,则获得垃圾值是正常的


这个问题不需要
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);
现在,让我们来讨论一下您的
最大元素
函数

  • 您不需要在这里调用malloc,因为已经分配了内存
  • 当您执行
    *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);
    
    现在,让我们来讨论一下您的
    最大元素
    函数

  • 您不需要在这里调用malloc,因为已经分配了内存
  • 当您执行
    *nbr=*(nbr+i);
    时,您会更改数组中第一个元素的值。我认为您希望执行
    m=*(nbr+i);
    不是吗
  • 为什么不使用
    nbr[i]
    而不是
    *(nbr+i)
  • 此功能的正确实现如下(未测试):

    void最大元素(int*nbr)
    {
    int i=0;
    int max=0;
    而(i<8)
    {
    如果(最大值
    最后一件事,使用malloc包括在执行此操作时使用函数释放内存