C在void函数之后由指针发送的数组的值

时间:2017-05-20 15:08:44

标签: c arrays function pointers

我目前正在尝试使用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;

    }
}

提前谢谢你。

1 个答案:

答案 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的计数保持同步才能使代码正常工作。