c - 可用的结构体指针比指定的多吗?

标签 c arrays pointers struct

相关帖子:Delete folder with items

如何才能使指向结构体的指针数组中的指针数量多于指定数量?对于ftw/ftwn的学习工具,我重写了ftw相关帖子(上面)中的ftwn解决方案。基本上使用 ftw 回调来填充包含每个文件的文件名、类型和深度的结构数组。然后,文件删除从最大深度到 0,一路删除文件,然后删除目录。这是一个测试,因此 printf 显示应该调用 unlinkrmdir 的位置,并且永远不会执行删除命令。

尝试了 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/

相关文章:

c - Linux 中的 fork() 函数

c - 如何计算乘法表的总和

c - 指针不正确计数 [C]

c - 如何通过引用将 char * foo[SIZE][SIZE] 传递给函数并取消引用它?

c - 什么时候使用回调函数?

c - 数组和指针的算术

javascript - React.js - 无法读取未定义的属性 'map'

c++ - 为什么在使用堆叠 std::array 声明多维数组时需要 "double braces"?

c - 这两个函数指针声明有什么区别?

C++,将n个参数的函数作为参数传递