失敗すると予想される次のコードがありますが、正しく機能しているようです。これが何らかのセグメンテーション違反を引き起こさない理由に混乱しています。
#include <stdio.h>
#include <stdlib.h>
struct entry {
int foo;
};
struct table {
int size;
struct entry* entries;
};
typedef struct table *Table;
typedef struct entry Entry;
int main() {
Table table = malloc(sizeof(struct table));
table->entries = malloc(sizeof(struct entry) * 1);
(table->entries)[5].foo = 5;
for (int i = 0; i < 10; i++) {
printf("Entry #%d: %d\n",i,(table->entries)[i].foo);
}
}
table->entries の 1 つのエントリに十分なスペースを malloc しただけなので、0 以外のインデックスへのアクセスは範囲外になると予想していました。しかし、このプログラムを実行すると、インデックス 5 のエントリの foo 値として 5 が出力され、残りは 0 として出力されます。これは正しい動作です。なぜこれが失敗しないのですか?