从函数返回的静态字符数组提供错误的答案

时间:2018-12-24 14:17:27

标签: c

根据此代码:

int main(){
    int x=1;
    int y=2;
    printf(" %s + %s = %s ", function(x) , function(y), function(x+y));
}

char* function(int num){
    static char B[20];
    sprintf(B,"%d",num);
    return B;
}

我得到的答案是:1 +1 = 1

问题是为什么?

为什么要这样分隔行:

int main(){
    int x=1;
    int y=2;
    printf("%s +" function(x));
    printf(" %s =" function(y));
    printf(" %s"function(x+y));
}

我得到了我期望的正确答案?

2 个答案:

答案 0 :(得分:3)

由于只有一个缓冲区B,因此每次函数调用都会覆盖它。由于您在printf中进行的main调用会调用函数3次,因此sprintf会找到3次相同的缓冲区。而且,不能保证在函数参数的求值中调用函数的顺序。

答案 1 :(得分:3)

函数function始终返回相同的值,即指向静态数组B开头的指针。

在第一个代码段中,作为对funtion的调用的一部分,您多次调用printf。调用函数时,必须在调用函数之前评估其每个参数。这意味着function在调用printf之前被调用了3次,因此B仅包含在那里存储的最新值。这意味着您最终会打印3次相同的内容。

此外,函数的参数计算顺序不确定,因此您不会对function的调用是最后一个。打印三次的值可以是1、2或3。

在第二个代码段中,由于您在每个function调用中只调用一次printf,所以对于要打印的内容没有任何歧义。