c - 从函数返回 int 类型数组的问题

标签 c arrays pointers malloc

我读过很多文章,给出了从函数返回 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/

相关文章:

c++ - C 和 C++ --- undefined reference

c - 当我使用malloc时,如何在C中获取* char的大小?

c - 如何保留稍后销毁的字符串的内容?

c - malloc 不断返回相同的地址

c++ - 通过 QI 或继承实现 IUnknown 相等的区别

无法打印 '1' ?

c - 为什么在 strcpy 改变它的值之后 tt[9] 是 '4'?

捕捉堆栈溢出

javascript - 将 JSON 结果添加到 JavaScript 列表

c - 如何在 C 中将一个 char 数组的某些位获取到另一个 char 数组?