如何使用指向struct的指针数组中的指针多于指定的指针?对于 ftw / ftwn 的学习工具,我在ftw的相关帖子(上面)中重写了ftwn解决方案。基本上使用ftw回调来填充包含每个文件的文件名,类型和深度的结构数组。文件删除然后从maxdepth继续到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'大于可用的struct指针,所以我不认为这是ftw限制文件描述符和关闭/重新打开文件的结果。
我已搜索过,但无法找到有关如何获得更多指针的解释。这里有人知道这会怎么样吗?
test program source可用。 安全 - 删除NOTHING ,只打印printf
。使用以下内容构建:gcc -Wall -o rmftws rmdir-ftw-static.c
感谢您提供的任何见解。
答案 0 :(得分:0)
超出数组的范围只会导致未定义的行为。如果它出现故障会很好,但不需要这样做。
就具体问题而言 - 编译器已要求系统分配一个段来包含静态数据并告诉它有多大。当它进行分配时,系统可能过度分配存储,通常直到页面边界。
答案 1 :(得分:0)
在这样的数组中声明100个指针,并不总能保证段错误。如果你使用的指针多于数组大小,它保证的是内存覆盖。但是,如果覆盖的内存属于您声明的其他变量,它们的值将被删除,但您不会在那里遇到错误,然后在您的代码中稍后尝试使用存储在这些变量中的任何值,在这种情况下,您的代码可能会出现异常,但不会崩溃,或者可能会在某些时候崩溃,但原因不一定与覆盖初始数组有关。
在使用该数组的第101个位置时可能会立即崩溃的一种情况是,数组恰好由编译器在当前数据部分的确切末尾分配,然后下一个是写保护的。但这是编译器和操作系统控制的问题。