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

时间:2017-08-04 14:16:45

标签: 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()中调用函数时,输出会给出不合理的值。我正在努力找到我的代码错误,有关如何调试/修复此问题的任何建议吗?

更新

我在fucntion 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;
        }
    }

我现在正在获得我想要的输出。

2 个答案:

答案 0 :(得分:3)

malloc()返回单位记忆。

在函数内部,ret[j]的赋值是条件。您永远不会确定实际初始化了哪个或任何索引元素。返回指针后,无条件地将指针索引到任意位置以读取可能非常好的单位化的值。

如果你返回具有相同赋值条件的指针,你至少可以使用返回0填充内存的calloc(),所以至少你有一个确定性值。但是,这将无法区分剩余索引元素和实际具有值0的元素。为了更好的精度,您可以memset() malloc() - 内存到某个保护值,这表示那些节点值没有分配。

此外,另一个 quickfix 将添加一个else条件,这基本上有助于无条件地为每个元素分配值。

答案 1 :(得分:0)

似乎循环必须是:

    int k= 0;
    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[k++] = arr[j+1];
        }
    }
    ret[k]= 0;
    return ret;
}

并在主要:

    int w= 0;
    while (p[w]) printf(" Peak %d\t",p[w++]); 

这将创建一个以空条目终止的峰值列表。