【问题标题】:Static char array return from function Provides incorrect answer从函数返回的静态字符数组提供了不正确的答案
【发布时间】:2018-12-24 14:17:27
【问题描述】:

根据这段代码:

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

如我所料,我得到了正确答案???

【问题讨论】:

标签: c


【解决方案1】:

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

在第一个代码 sn-p 中,作为对 printf 的调用的一部分,您调用了三次 funtion。调用函数时,必须在调用函数之前计算其每个参数。这意味着function 在调用printf 之前被调用了3 次,所以B 只包含存储在那里的最新值。这意味着您最终会打印 3 次相同的内容。

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

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

【讨论】:

  • 但是在每次调用函数时,数组 B 的值都会发生变化。如果是这样,正如你所说 - 它存储最新的值,那么打印应该是 3 + 3 = 3 ?
  • @avimenashe 函数调用参数的求值顺序未指定。
【解决方案2】:

由于只有 一个 缓冲区B,它会被每个函数调用覆盖。因为您在 main 中的 printf 调用调用了该函数 3 次,所以 sprintf 会找到相同的缓冲区所有 3 次。并且无法保证在评估函数参数时调用函数的顺序。

【讨论】:

    猜你喜欢
    • 2020-10-10
    • 2020-10-04
    • 1970-01-01
    • 1970-01-01
    • 2015-12-02
    • 2023-03-22
    • 2018-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多