如何从函数中使用 malloc?
How can I use malloc from a function?
我想了解 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 一起运行?我做错了什么,为什么我的代码只给我垃圾号码?
我做错了什么,为什么我的代码只给我垃圾号码?
In largest_element(int *nbr)
nbr
指向数组 tab
in main
(至少如果你这样称呼它: largest_element(tab);
而不是这样largest_element(&tab[8]);
然后你现在调用nbr = (int*)malloc(sizeof(nbr) + 8);
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。因此在您的 largest_element
函数中,i
应该初始化为 0 而不是 1。
原因是,当你处理数组时,你处理的是指针。在您的例子中, tab
是指向数组第一个元素的指针。因此,当您执行 tab[3]
时,您将获得数组的第四个元素。
第二件事:当你做的时候:
largest_element(&tab[8]);
您将数组开始后的第八个元素发送给您的函数。问题是:你不拥有这个内存区域!您仅拥有 tab[7] 之前的内存。
如果您想将完整的数组发送到您的函数,只需使用:
largest_element(tab);
现在,让我们谈谈您的 largest_element
功能。
- 这里不需要调用malloc,因为内存已经分配好了
- 当您执行
*nbr = *(nbr + i);
时,您更改了数组第一个元素的值。我想你想做 m = *(nbr + i);
是吧。
- 为什么不使用
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 在您不再需要时释放内存。
我想了解 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 一起运行?我做错了什么,为什么我的代码只给我垃圾号码?
我做错了什么,为什么我的代码只给我垃圾号码?
In largest_element(int *nbr)
nbr
指向数组 tab
in main
(至少如果你这样称呼它: largest_element(tab);
而不是这样largest_element(&tab[8]);
然后你现在调用nbr = (int*)malloc(sizeof(nbr) + 8);
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。因此在您的 largest_element
函数中,i
应该初始化为 0 而不是 1。
原因是,当你处理数组时,你处理的是指针。在您的例子中, tab
是指向数组第一个元素的指针。因此,当您执行 tab[3]
时,您将获得数组的第四个元素。
第二件事:当你做的时候:
largest_element(&tab[8]);
您将数组开始后的第八个元素发送给您的函数。问题是:你不拥有这个内存区域!您仅拥有 tab[7] 之前的内存。
如果您想将完整的数组发送到您的函数,只需使用:
largest_element(tab);
现在,让我们谈谈您的 largest_element
功能。
- 这里不需要调用malloc,因为内存已经分配好了
- 当您执行
*nbr = *(nbr + i);
时,您更改了数组第一个元素的值。我想你想做m = *(nbr + i);
是吧。 - 为什么不使用
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 在您不再需要时释放内存。