c-如何从函数中使用malloc



我正在努力了解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]);

您将数组开始后的第八个元素发送给函数。问题是:你没有这个内存区域!您只能在选项卡[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,就像这个问题不需要浮点数学或文件系统相关函数一样。

相关内容

  • 没有找到相关文章