C语言 从函数返回 int 类型的数组时出现问题



我已经阅读了很多帖子,在这些帖子中,您可以从函数返回 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 %dt",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()中调用函数时,输出给出了不合理的值。我正在努力查找代码中的错误,有关如何调试/解决此问题的任何建议?

更新

我将功能中的 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 以读取可能非常单位化的值。

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

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

似乎循环必须是:

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 %dt",p[w++]); 

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

相关内容

  • 没有找到相关文章

最新更新