当作为参数传递给其他函数时,数组指针会更改值

时间:2013-06-02 11:21:30

标签: c arrays function pointers parameters

我的问题是,当我将函数“sense”收集的指针数组“q”传递给其他函数“move”时,“q”中的值会随机变化。任何回应都将非常感激。 这是我的代码:

Main()
int main(int argc,char *argv[])
{
    int i,j,k;
    float *p=(float *)malloc(sizeof(float));
    float *q=(float *)malloc(sizeof(float));
    j=0;
    k=0;

    for(i=0;i<NCELLS;i++)
                 p[i]=1.0/NCELLS;

        q=sense(p,j); //Gives write values in q
    j++;

    q=move(q,motion[k]); // when passed to "move" values of q randomly changes
    k++;

    printf("\n");
    for(i=0;i<NCELLS;i++)
                printf("%f\t", q[i]);

    printf("\n");
    return 0;
}
functions:
float* move(float *p,int U)
{
    int i;
    float temp;
    float *next=(float *)malloc(sizeof(float));
    printf("\n");
    for(i=0;i<NCELLS;i++)
            printf("%f\t", p[i]); //Here I am checking for change in values
    for(i=0;i<NCELLS;i++)
    {
        temp=pGoal*p[mod(i-U,NCELLS)];  
        temp=temp+pOvershoot*p[mod(i-U+1,NCELLS)]; 
        temp=temp+pUndershoot*p[mod(i-U-1,NCELLS)]; 
        next[i]=temp;
    }  

    return(next);
}

float* sense(float *p,int j)
{
    int i;
        float *q, sum;
    q=(float *)malloc(sizeof(float));
        sum=0;
        for(i=0;i<NCELLS;i++)
        {
                if(strcmp(World[i],Sense[j])==0)
                        q[i]=pHit*p[i];
                else
                        q[i]=pMiss*p[i];

                        sum+=q[i];     
         }
     for(i=0;i<NCELLS;i++)
                q[i]=q[i]/sum;

    return(q);
}

1 个答案:

答案 0 :(得分:0)

float *q=(float *)malloc(sizeof(float));

您分配了多少float个?之一。

for(i=0;i<NCELLS;i++)
            printf("%f\t", q[i]);

您尝试访问了多少float个?五。你觉得这里有问题吗?如果你想要五个浮点数,请分配五个浮点数:

float *q = malloc(5 * sizeof *q);

move函数中,分配并返回一个新数组,仅丢弃旧数组而不会在返回后丢弃旧数组(使用free)。这会导致内存泄漏。为什么你甚至需要malloc?不要在这些功能中调用malloc;保留调用者(main)的决定。在这种情况下,调用者不需要动态分配,因此它从选择中获益匪浅。使用正确的工具......

我建议为这些功能采用与memcpy一致的样式。任何外部变量都应作为参数或在作为参数提供的结构内部提供。

void find_move(float *, float const *, size_t, size_t, float, float, float);
void find_sense(float *, float const *, size_t, char const * const *, char const *, float, float);

int main(void)
{
    float p[NCELLS], q[NCELLS];

    for (size_t i = 0; i < NCELLS; i++)
    {
        p[i] = 1.0 / NCELLS;
    }

    find_sense(q, p, NCELLS, world, sense[1], hit, miss);
    find_move(p, q, NCELLS, 0, goal, overshoot, undershoot);

    for (size_t i = 0; i < NCELLS; i++)
    {
        printf("%f\t", p[i]);
    }

    putchar('\n');
}

void find_move(float *destination, float const *source, size_t length, size_t offset, float goal, float overshoot, float undershoot)
{
    for (size_t i = 0; i < length; i++)
    {
        float temp = goal * source[mod(i - offset, length)]
                   + overshoot * source[mod(i - offset + 1, length)]
                   + undershoot * source[mod(i - offset - 1, length)];
        printf("%f\t", source[i]);
        destination[i] = temp;
    }
    putchar('\n');
}

void find_sense(float *destination, float const *source, size_t length, char const * const *world, char const *sense, float hit, float miss)
{
    float sum = 0;

    for (size_t i = 0; i < NCELLS; i++)
    {
        if (strcmp(world[i], sense) == 0)
        {
            destination[i] = hit * source[i];
        }
        else
        {
            destination[i] = miss * source[i];
        }

        sum += destination[i];     
    }

    for (size_t i = 0; i < length; i++)
    {
        destination[i] /= sum;
    }
}

P.S。请注意此处使用的一致空格和描述性标识符。我甚至把支撑放在人们期望的地方,不管看起来多么不必要。我希望如果我的代码很可怕,你就不想破译它。您可能会忽略答案并等待新答案,就像大多数人会忽略您的问题并等待新问题一样......当您向我们提供代码时请记住这一点。