从函数返回的静态字符数组 提供不正确的答案



根据以下代码:

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));
}

正如我所期望的那样,我得到了正确的答案???

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

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

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

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

由于只有一个缓冲区B,每次函数调用都会覆盖它。由于printf调用 main 调用函数 3 次,因此 sprintf 三次都找到相同的缓冲区。并且无法保证在函数参数的计算中调用函数的顺序。

相关内容

最新更新