我已阅读了很多帖子,介绍了如何从函数中返回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;
}
}
我现在正在获得我想要的输出。
答案 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++]);
这将创建一个以空条目终止的峰值列表。