【发布时间】: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。我看不出这有什么问题?