如何才能使指向结构体的指针数组中的指针数量多于指定数量?对于ftw/ftwn的学习工具,我重写了ftw相关帖子(上面)中的ftwn解决方案。基本上使用 ftw 回调来填充包含每个文件的文件名、类型和深度的结构数组。然后,文件删除从最大深度到 0,一路删除文件,然后删除目录。这是一个测试,因此 printf
显示应该调用 unlink
或 rmdir
的位置,并且永远不会执行删除命令。
尝试了 3 种不同的方式来存储结构数组。 (1) 静态指定可用指针的数量 struct _rmstat *rmstat [100];
(ftw 'nopenfd' 设置为 200),(2) 动态分配 struct _rmstat **rmstat;
最后 (3) 将信息添加到链接列表中。测试静态分配时,我特意选择了小于100个文件的测试目录,然后是超过100个文件的目录,导致失败。
令我惊讶的是,静态分配的测试通常会处理包含超过 100 个文件的目录,最多可达 450 个!这怎么可能?我认为静态分配 struct _rmstat *rmstat [100]; 应该保证在尝试第 101 次结构分配时出现段错误(或类似的核心转储)。 gcc 中有什么东西可以在堆栈/堆分配中执行此操作吗?或者,这只是“未定义”行为的一部分吗?使用ftw,我将'nopenfd'设置为大于可用的结构指针,因此我不认为这是ftw限制文件描述符和关闭/重新打开文件的结果。
我已经搜索过,但找不到关于如何获得比指定数量更多的指针的解释。这里有人知道这是怎么发生的吗?
test program source可用。 它是安全的 - 它不会删除任何内容,只是用 printf
打印。构建方式:gcc -Wall -o rmftws rmdir-ftw-static.c
感谢您提供的任何见解。
最佳答案
超出数组的界限只会导致未定义的行为。如果它出现段错误,那就太好了,但这不是必需的。
就具体问题而言 - 编译器要求系统分配一个段来包含静态数据,并告诉它要多大。当进行分配时,系统可能会过度分配存储,通常会达到页边界。
关于c - 可用的结构体指针比指定的多吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23596567/