Linuxカーネル(バージョン4.8)では、 "struct pid"は次のように定義されています(ファイル:http://lxr.free-electrons.com/source/include/linux/pid.h)。ここで "numbers [1]"(64行目)は静的配列であり、配列の大きさは1であるため、要素を1つしか持てません。配列の要素の数をコンパイル時に定義された配列のサイズより多くすることは可能ですか?
57 struct pid
58 {
59 atomic_t count;
60 unsigned int level;
61 /* lists of tasks that use this pid */
62 struct hlist_head tasks[PIDTYPE_MAX];
63 struct rcu_head rcu;
64 struct upid numbers[1];
65 };
しかし、その後、(ファイルから:http://lxr.free-electrons.com/source/kernel/pid.c)次の行319にコード320で、アレイ "数字" が '番号[i]が' としてforループの内側にあります。変数 'i'はセグメンテーションフォルトを発生させずにゼロ以外の値を持つことができないので、どのように正しいですか?私はループ中に 'i'の値をチェックして、それが1以上になるかどうかを確認しました。はい、それでも、私はセグメンテーション・フォルトが表示されません。ここに何かがないのですか?
297 struct pid *alloc_pid(struct pid_namespace *ns)
298 {
299 struct pid *pid;
300 enum pid_type type;
301 int i, nr;
302 struct pid_namespace *tmp;
303 struct upid *upid;
304 int retval = -ENOMEM;
305
306 pid = kmem_cache_alloc(ns->pid_cachep, GFP_KERNEL);
307 if (!pid)
308 return ERR_PTR(retval);
309
310 tmp = ns;
311 pid->level = ns->level;
312 for (i = ns->level; i >= 0; i--) {
313 nr = alloc_pidmap(tmp);
314 if (nr < 0) {
315 retval = nr;
316 goto out_free;
317 }
318
319 pid->numbers[i].nr = nr;
320 pid->numbers[i].ns = tmp;
321 tmp = tmp->parent;
322 }
に指定された数safety netsそれは限り、C標準に関しては「正しい」ではないのですが、それはLinuxカーネルの開発者にはほとんど関心があるがありません。それはおそらく彼らのために "働く"でしょう。 C99は 'numbers []'でこの構造を正しくサポートしていますが、LinuxではC99を使用していません。 –
こんにちはKerrek、あなたの素早い返答をありがとう。それが正しくない場合、なぜそれはsegaultを与えませんか? – psin
@psin:Cの何もあなたにsegfaultを保証しません。間違ったプログラムが予想どおりに動作する可能性があります。コードはおそらく意図したとおりに動作することが知られているツールでのみ構築されます。 –