我目前正在尝试使用C进行移动平均,我想将我的地址发送到函数并计算函数内的移动平均值。但是,每当我离开函数内部的for循环时,最初指向初始数组的指针会发生变化,我不知道如何解决问题。这是我的代码:
include <stdio.h>
#include <stdlib.h>
#define n 10
void monAvg(const float *in, float *out, int m);
int main(int argc, char *argv[])
{
float table_in[]={1,2,3,4,5,5,4,3,2,1};
float table_out[]={0};
if (argc != 2) {
printf ("Incorrect number of program arguments");
return 0;
}
if (atof(argv[1]) < 1 || atof(argv[1]) > n)) {
printf ("Invalid program argument value");
return 0;
}
monAvg(table_in, table_out, atof(argv[1]));
return 0;
}
void monAvg(const float *in, float *out, int m) {
float temp;
int i,j;
for (i = 0; i < (n - m + 1); i++) {
temp = 0;
for (j = i; j < i + m; j++) {
temp += *(in + j);
}
*(out + i) = temp/m;
}
}
提前谢谢你。
答案 0 :(得分:1)
问题是您有未定义的行为:您的输出数组分配了一个项目,因此处理大小超过1
的输入会导致写入超过table_out
的已分配段。
您可以通过明确调整数组大小来解决此问题:
float table_out[sizeof(table_in)/sizeof(table_in[0])]={0};
注意:表达式sizeof(table_in)/sizeof(table_in[0])
计算table_in
中的元素数量。您可以使用它来代替硬编码n
,必须与table_in
的计数保持同步才能使代码正常工作。