https://kukuruku.co/post/i-do-not-know-c/這個指針別名是如何工作的?
問題#7:小端系統上的兩個不同的編譯器
#include <stdio.h>
void f(int *i, long *l)
{
printf("1. v=%ld\n", *l); /* (1) */
*i = 11; /* (2) */
printf("2. v=%ld\n", *l); /* (3) */
}
int main()
{
long a = 10;
f((int *) &a, &a);
printf("3. v=%ld\n", a);
return 0;
}
輸出是:
1. v=10 2. v=11 3. v=11
1. v=10 2. v=10 3. v=11
如何爲第二次的結果可能嗎?我並不完全明白通過引用嚴格別名來解釋結果的解釋。編譯器是否完全忽略了行(2)?
這是未定義的行爲。 * Upd:*順便說一句,看着文章,它*是*關於未定義的行爲。你讀過嗎? –
我的猜測是你的編譯器2(可能是什麼)可能是做了一些'不成熟的優化' – Zakir
@Zakir編譯器不容易*過早*優化.... –