2
2次元配列のエイリアスを作成するときのstrlenの予期しない最適化
これが私のコードです: #include <string.h> #include <stdio.h> typedef char BUF[8]; typedef struct { BUF b[23]; } S; S s; int main() { int n; memcpy(&s, "1234567812345678", 17); n = strlen((char *)&s.b) / sizeof(BUF); printf("%d\n", n); n = strlen((char *)&s) / sizeof(BUF); printf("%d\n", n); } gcc 8.3.0または8.2.1を最適化レベル以外で使用すると-O0、0 2期待していたとおりに出力されます2 2。コンパイラは、strlenがに制限されb[0]ているため、除算される値と同じかそれ以上になることはないと判断しました。 これは私のコードのバグですか、コンパイラのバグですか? これは明確に規格に明記されていませんが、ポインターの来歴の主流の解釈は、どのオブジェクトXでも、コード(char *)&Xは全体を反復できるポインターを生成するべきだと思いましたX-この概念はXたまたま持っていても成り立つはずです内部構造としてのサブ配列。 (ボーナス質問、この特定の最適化をオフにするgccフラグはありますか?)