【问题标题】:Length of a file path field in a struct结构中文件路径字段的长度
【发布时间】:2014-10-22 17:51:45
【问题描述】:

我正在构建一个读取 XML 配置文件的程序。 XML 配置文件包含几个变量。其中之一是

<bin_file>/some/file/path/file.bin</bin_file>

在我的代码中,我有以下结构

struct buildConofig {
  char foo[3];
  char bar[2];
  char bin_file[?];
};

代码查看 XML 文件并在找到 XML 中的匹配元素时填充结构。我不确定 bin_file 字段的长度应该是多少。文件路径大小有限制吗?

还是应该让 bin_file 成为指针,然后在检查 XML 字段后分配足够的字节?

感谢您的帮助。

【问题讨论】:

  • 指针和 malloc 稍后可能是最好的方法,但您始终可以使用您允许的最大大小并添加一些错误检查以避免错误。
  • 作为指导,FILENAME_MAX in &lt;stdio.h&gt;。 (MAX_PATH 不是标准的)但是文件名的长度实际上取决于各自的操作系统。
  • IMO:如果只有几个 struct buildConofig 实例,请使用 bin_file[MAX_PATH] 或等效项。否则,在检查 XML 字段后将 bin_file 设为指针,然后将 malloc 设为足够的字节。

标签: c


【解决方案1】:

正如其他人指出的那样,使用malloc() 可能是最安全的方式。在这种特殊情况下,依赖像FILENAME_MAX 这样的常量/宏甚至可能是危险的。从 XML 文档中读取该路径时,它仍然只是一个字符串,因此它几乎可以是任意长度(如果您不手动将其截断,那么它会很高兴地溢出您的 char buffer[FILENAME_MAX])。

【讨论】:

    【解决方案2】:

    在不同的系统有一点不同 如:

    ubuntu 12.04:
    NAME_MAX: 255     //file max length
    PATH_MAX: 4096    // path max length
    

    如上所示,最大尺寸可能是 255*4096= 1044480?这意味着你应该这样做

     char bin_file[1044480];
    

    但不建议这样做。

    您可以包含 string.h 并执行以下操作

    #include<string.h>
    struct buildConofig {
      char foo[3];
      char bar[2];
      string bin_file;
    };
    

    【讨论】:

    • string.h 没有定义结构字符串。如果您的意思是 std::string 则请注意此 Q 标记为 C
    • 我犯了一个错误。 C中没有字符串结构,PATH_MAX表示路径的最大深度,所以它是255*4096
    猜你喜欢
    • 2011-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-29
    • 2017-06-03
    相关资源
    最近更新 更多