【问题标题】:How can I use malloc from a function?如何从函数中使用 malloc?
【发布时间】:2017-01-20 14:59:45
【问题描述】:

我正在尝试了解 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。您正在从数组中读取,而不是修改它。另外,你应该传入tab,而不是&amp;tab[8]
  • 我正在尝试了解 malloc 的工作原理以及如何使用 malloc 解决此问题。
  • 那么请也提供问题的定义。
  • 它打印出垃圾值或 0 而不是正确的数字。
  • 问题的定义,伙计。英文。

标签: c arrays int malloc dynamic-memory-allocation


【解决方案1】:

我认为你迷失了指针和数组,所以你无法正确理解 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 在不再需要时释放内存。

【讨论】:

  • 仅供参考 - 不要投射 Xalloc() 的结果
  • 我完全同意,你是对的。我在没有 malloc 的情况下执行了相同的功能并且它有效。只是我想确定如何使用malloc。还是谢谢你。
【解决方案2】:

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

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

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

您根本不需要 malloc 来解决这个问题,就像您不需要浮点数学或文件系统相关函数来解决这个问题一样。

【讨论】:

    猜你喜欢
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多