我读过很多文章,给出了从函数返回 int 类型数组的方法。我尝试遵循使用 malloc()
函数在函数内部动态分配内存的方法。
在示例代码中,我使用函数 foo
来计算数组中大于指定值的峰值。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* function declaration */
int *foo(int arr[],int size);
int main()
{
int test[] = {1,2,1,4,5,2,7,8,9,1}; //array of test data.
int *p;
p = foo(test,10);
int w;
for(w=0;w<5;w++)
{
printf(" Peak %d\t",p[w]); // This line is giving a non sensible answer.
}
free(p); // free the memory
return 0;
}
int *foo(int arr[],int size) {
int j;
int Peak_min = 3; // Minimum peak height
int *ret = malloc(size * sizeof(*ret));
if(!ret) return 1;
for (j = 0; j < size -1; ++j)
{
if ( (arr[j] < arr[j+1]) && (arr[j+1] > arr[j+2]) && (arr[j+1] > Peak_min))// Peak criteria
{
ret[j] = arr[j+1];
printf(" Peak_No %d",ret[j]); // This line is giving the correct output.
}
}
return ret;
}
函数中打印的输出给出了 5 和 9,正如预期的那样。但是,当我调用 int main() 中的函数时,输出给出了不合理的值。我正在努力寻找代码中的错误,关于如何调试/修复此问题有什么建议吗?
更新
我将 foo 函数中的 for 循环编辑为
for (j = 0; j < size -2; ++j)
{
if ( (arr[j] < arr[j+1]) && (arr[j+1] > arr[j+2]) && (arr[j+1] > Peak_min))// Peak criteria
{
ret[j] = arr[j+1];
printf(" Peak_No %d",ret[j]); // This line is giving the correct output.
}
else
{
ret[j] = 0;
}
}
我现在得到了我想要的输出。
最佳答案
malloc()
返回未初始化的内存。
在函数内部,ret[j]
的赋值是有条件的。您永远无法确定哪个或任何索引元素实际上已初始化。返回指针后,您无条件索引到指针 any 以读取可能很好地统一化的值。
如果您要返回具有相同赋值条件的指针,您至少可以使用 calloc()
它返回 0 填充的内存,因此至少您有一个确定性值。但是,这将无法区分剩余索引元素和实际值为 0 的元素。为了获得更好的精度,您可以使用 memset()
和 malloc()
-ed 内存到某个保护值,表示这些节点值未分配。
此外,另一个快速修复是添加一个else
条件,这基本上有助于无条件地为每个元素分配一个值。
关于c - 从函数返回 int 类型数组的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45509116/