C 指向结构的指针比指定的多?

C 指向结构的指针比指定的多?,c,arrays,pointers,struct,C,Arrays,Pointers,Struct,相关职位: 在指向struct的指针数组中,如何使用比指定的指针更多的指针?对于ftw/ftwn的学习工具,我在ftw的相关文章(上面)中重写了ftwn解决方案。基本上使用ftw回调来填充包含每个文件的文件名、类型和深度的结构数组。文件删除然后从maxdepth继续到0删除文件,然后一路删除目录。这是一个测试,因此printf显示应调用unlink或rmdir的位置,并且从不执行删除命令 结构数组的存储尝试了3种不同的方式。(1) 静态指定可用指针的数量struct\u rmstat*rmsta

相关职位:

在指向struct的指针数组中,如何使用比指定的指针更多的指针?对于ftw/ftwn的学习工具,我在ftw的相关文章(上面)中重写了ftwn解决方案。基本上使用ftw回调来填充包含每个文件的文件名、类型和深度的结构数组。文件删除然后从maxdepth继续到0删除文件,然后一路删除目录。这是一个测试,因此
printf
显示应调用
unlink
rmdir
的位置,并且从不执行删除命令

结构数组的存储尝试了3种不同的方式。(1) 静态指定可用指针的数量
struct\u rmstat*rmstat[100](ftw'nopenfd'设置为200),(2)动态分配
struct\u rmstat**rmstat和最后(3)将信息添加到链接列表中。在测试静态分配时,我特别选择了少于100个文件的测试目录,然后选择了多于100个文件的目录,以导致失败

令我惊讶的是,静态分配的测试通常会处理包含100多个文件的目录,多达450个!这怎么可能?我认为静态分配
struct\u rmstat*rmstat[100]应保证在尝试101st结构分配时出现segfault(或类似的核心转储)。gcc中有什么东西可以在堆栈/堆分配中做到这一点吗?或者,这只是“未定义”行为的一部分吗?对于ftw,我将“nopenfd”设置为大于可用的结构指针,因此我认为这不是ftw限制文件描述符和关闭/重新打开文件的结果

我已经搜索过了,但是找不到一个解释来解释为什么你可能会得到比指定的更多的指针。这里有人知道这是怎么发生的吗


该软件是可用的它是安全的-它不删除任何内容,只使用
printf
打印。使用以下内容构建:
gcc-Wall-o rmftws rmdir ftw static.c
感谢您提供的任何见解。

超出数组边界只会导致未定义的行为。如果它出现seg故障就好了,但不需要这样做


就具体问题而言,编译器要求系统分配一个包含静态数据的段,并告诉它该段有多大。在进行分配时,系统可能会过度分配存储,通常分配到页面边界

在这样的数组中声明100个指针并不总是保证segfault。如果使用的指针多于数组大小,则它可以保证内存覆盖。但是,如果被覆盖的内存属于您声明的其他变量,那么它们的值将被丢弃,但您不会有任何错误,然后,直到稍后在代码中尝试使用存储在这些变量中的任何值,在这种情况下,您的代码可能会出现错误,但不会崩溃,或者可能会在某个点崩溃,但原因与初始数组的覆盖无关


在使用该数组的第101个位置时,您可能会立即崩溃的一种情况是,如果编译器恰好在当前数据段的末尾分配了该数组,那么下一个数组是写保护的。但这是一个由编译器和操作系统控制的问题。

相关:沃恩、DrC和DNT,答案和链接都很棒。我没有过多考虑未指定、未定义和实现定义行为之间的区别。在这种情况下,与其简单地回答“Itdoeshissdummy…”,不如说这是一个“可能发生的事情”的例子,当您看到这样一种情况时,您很清楚代码的完全执行将超过一个预定义的限制,而这个限制本来应该受到保护。行为将只是未定义。我想就是这样。我运行了多台机器的代码,但未定义的结果各不相同。