我知道下面的代码块生成"未定义的行为"
#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;但是这里是函数调用....
答案 0 :(得分:3)
在此代码中,在两个序列点之间没有多次修改对象的实例。
对foo
的两次调用作为函数的参数不是未定义的行为,而是未指定的行为。这意味着可能会发生两件或两件以上的事情,但标准并未指定哪一件事。
在此示例中,由于可以按任何顺序评估函数参数,因此对foo
的两次调用可以按任何顺序进行。并且因为该函数总是返回指向静态缓冲区的指针,所以相同的数字将被打印两次,但不能保证你是否会得到&#34; 4 4&#34;或&#34; 12 12&#34;。