printf,连续函数作为参数,未定义的行为

时间:2018-03-19 17:43:18

标签: c undefined-behavior

我知道下面的代码块生成"未定义的行为"

#include <stdio.h>

char * foo(int i) {
    char static str[100];
    str[0] = 0;
    snprintf(str, sizeof(str), "%d", i);
    printf("foo %s\n", str);
    return str;
}

int main()
{
    printf("main %s %s\n", foo(12), foo(4));

    return 0;
}

我想知道这个代码块匹配&#34;未定义行为的情况&#34; in&#34; ISO / IEC 9899:1999(E):编程语言 - C&#34;。

这一个? &#34;在两个序列点之间,对象被多次修改或被修改 并且读取先前值而不是确定要存储的值(6.5)。&#34;但是这里是函数调用....

1 个答案:

答案 0 :(得分:3)

在此代码中,在两个序列点之间没有多次修改对象的实例。

foo的两次调用作为函数的参数不是未定义的行为,而是未指定的行为。这意味着可能会发生两件或两件以上的事情,但标准并未指定哪一件事。

在此示例中,由于可以按任何顺序评估函数参数,因此对foo的两次调用可以按任何顺序进行。并且因为该函数总是返回指向静态缓冲区的指针,所以相同的数字将被打印两次,但不能保证你是否会得到&#34; 4 4&#34;或&#34; 12 12&#34;。