【问题标题】:Issue with returning an array of type int from function从函数返回 int 类型数组的问题
【发布时间】:2017-08-04 14:16:44
【问题描述】:

我已经阅读了很多帖子,这些帖子提供了从函数返回 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;
        }
    }

我现在得到了我想要的输出。

【问题讨论】:

  • 如果foo函数分配失败,你应该返回一个空指针。
  • 那么把返回值1改成NULL?
  • 问题的一部分,当j等于size - 2,当你做arr[j+2]时会发生什么?
  • 另外,malloc 不会初始化它分配的内存,它的内容将是indeterminate
  • @Someprogrammerdude - 也许我误解了你在问我什么。在循环中,j 取值 0,1,2,3,4,5,6,7,8。我看不出这有什么问题?

标签: c arrays pointers malloc


【解决方案1】:

malloc() 返回未初始化的内存。

在函数内部,ret[j] 的赋值是有条件的。您永远无法确定实际初始化了哪个或任何索引元素。返回指针后,您无条件地索引指针 any 以读取可能很好地统一化的值。

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

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

【讨论】:

  • 您能再解释一下吗?我如何修改它以确保这些值总是被初始化?
  • @Sjoseph 现在好点了吗?
  • 我对内存分配非常陌生,因为直到最近我才真正使用 MATLAB!我正在慢慢开始吸收这些信息,现在将阅读 memset() 和 calloc()。
【解决方案2】:

似乎循环必须是:

    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++]); 

这会创建一个峰值列表,以空条目结束。

【讨论】:

  • 我尝试实现上述更改,但似乎陷入了无限循环!
  • 糟糕,是的,无限循环。应该是printf(" Peak %d\t",p[w++]); 注意++。你不能自己发现并修复它吗???
  • 我选择重新开始我最初的尝试,但感谢您的有用评论
猜你喜欢
  • 1970-01-01
  • 2015-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-07
  • 2011-07-01
  • 2014-04-20
  • 1970-01-01
相关资源
最近更新 更多