2014-05-11 125 views
-4

相关文章:Delete folder with items指向struct的指针比指定更多?

如何使指针数组中的指针可用于比指定更多的指针?对于ftw/ftwn的学习工具,我重写了ftwn相关文章(上面)中的ftwn解决方案。基本上使用ftw回调来填充包含文件名,每个文件的类型和深度的结构数组。然后,文件删除从maxdepth开始,直到删除文件,然后沿途删除目录。这是一个测试,所以printf显示unlinkrmdir应该被调用,删除命令永远不会执行。

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

令我惊讶的是,静态分配的测试会定期处理包含超过100个文件的目录,最多可达450个!这怎么可能?我认为静态分配struct _rmstat *rmstat [100];应该保证在尝试101st结构分配时发生段错误(或类似的核心转储)。在堆栈/堆分配中,gcc中是否有这样的功能?或者,这只是“未定义”行为的一部分吗?与ftw,我设置'nopenfd'大于可用的结构指针,所以我不认为这是ftw限制文件描述符和关闭/重新打开文件的结果。

我已经搜索,但找不到解释如何得到比指定更多的指针。这里有人知道这会发生吗?

test program source可用。 它是安全的 - 它删除任何东西,只是与printf打印。搭建:gcc -Wall -o rmftws rmdir-ftw-static.c感谢您提供的任何见解。

+1

相关:http://stackoverflow.com/q/2397984/951890 –

回答

0

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

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

+0

Vaughn,DrC和DNT,答案和链接都很棒。我没有多少关于未指定,未定义和实现定义行为之间的区别。在这种情况下,不是简单地回答“它做了这个虚拟的......”,而是当你看到一个你知道代码的完整执行的情况时,它更多的是“会发生什么”的例子。超过预先设定的限制,本应该受到保护。行为将简单地是未定义的。我认为这样做。我运行了多台机器的代码 - 具有各种未定义的结果。 –

0

在这样的数组中声明100个指针并不总是保证段错误。如果你使用比数组大小更多的指针,它保证的是内存覆盖。但是,如果被覆盖的内存属于你声明的其他变量,它们的值将被丢弃,但是你不会在那里出现错误,然后,直到后来在你的代码中,你尝试使用你存储在这些变量中的任何值,在这种情况下,您的代码可能会行为不当,但不会崩溃,或者可能会在某些时候崩溃,但出于与覆盖初始数组不明显相关的原因。

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