c - 如何从函数中使用 malloc?

标签 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)
    {
        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 函数。

  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在您不再需要时释放内存。

关于c - 如何从函数中使用 malloc?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41766540/

相关文章:

C - #include 和多个 typedef

c++ - 获取当前工作目录相对路径,而不是绝对路径

c - 在 C 中 malloc sizeof 一个 typedef 结构

python - Numpy:如何按整数值缩放整数数组?

c++ - 如何将字符数组中的前 i 个字符复制到 C++ 中的另一个字符数组中?

c - 在c编程中获取二维数组内3x4矩阵的总分、平均分、最大分和最小分

c++ - 显示正确的整数结果

c++ - 从 Visual Studio 2013 迁移到 Visual Studio 2015 后,调用 printf 样式的函数会导致警告

java - 如何获取从 1 开始到 n 结束的 String ?

c - 用 C 中充满数字的 char 数组填充 int 数组(char 数组到 int 数组)