功能参数的赋值对函数外没有影响

时间:2013-06-16 12:36:27

标签: c

为什么最后一行参数可能在函数外无效:

void save_last_frame( uint8_t *saveframe, uint8_t *curframe,
                             int width, int height, int savestride, int curstride )
{
    height /= 2;
    height--;
    while( height-- ) {
        blit_packed422_scanline( saveframe, curframe, width );
        saveframe += savestride;
        interpolate_packed422_scanline( saveframe, curframe, curframe + (curstride*2), width );
        saveframe += savestride;
        curframe += (curstride*2);
    }
    blit_packed422_scanline( saveframe, curframe, width );
    saveframe += savestride;
    blit_packed422_scanline( saveframe, curframe, width );
    saveframe += savestride;   // <-- Assignment of function parameter has no effect outside the function
}

由于

2 个答案:

答案 0 :(得分:1)

在C中,参数本质上是局部变量,使用作为参数传入的值进行初始化。这意味着只有在执行函数时它们才存在。一旦函数存在,您的saveframe变量就不再存在,并且它与您指定的值一起存在。

为了修改函数外部存在的值,您应该使用指针并通过该指针修改指向的值。

由于您使用的值已经是指针,因此您应该使用指向指针的指针:

void save_last_frame( uint8_t **saveframe, uint8_t **curframe,
                             int width, int height, int savestride, int curstride )

然后,您应该相应地修改代码,将saveframe替换为*saveframe。类似地,对于curframe,如果您也希望由函数更新它。

此类“输出指针”参数的示例是endptr,用于记录strtol()中已解析数字字符串的结尾。

答案 1 :(得分:0)

您已将变量saveframe作为指针传递;要更改函数外的值,请执行以下操作:

*saveframe += savestride; 

代替。这样,即使在退出功能后,您的值也会保留。