在linux内核(版本4.8)中, “struct pid”定义如下(来自文件:http://lxr.free-electrons.com/source/include/linux/pid.h)。这里“numbers [1]”(在第64行)是一个只能有一个元素的静态数组(因为数组大小被称为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 };
但随后,在线路319和320下面的代码(从文件:http://lxr.free-electrons.com/source/kernel/pid.c),阵列 “数字” 是内部的for循环 '号码[I]'。它甚至是正确的,因为变量'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 }
这不是“正确”至于C标准而言,那不过是兴趣不大的Linux内核开发的。它可能对他们“起作用”。 (当然,后备内存是动态分配的。)C99使用数字[]'正确支持这种结构,但Linux不使用C99。) –
嗨Kerrek,感谢您的快速回复。如果它不正确,那么为什么它不会导致任何seg故障? – psin
@psin:C中的任何内容都不能保证你的段错误。一个不正确的程序可能会发生按预期行事。代码大概只能使用已知行为的工具来构建。 –