c - fopen() 破坏路径参数

标签 c

在将变量传递给 fopen() 而不是字符串文字时,我遇到了一个奇怪的错误。这是有问题的代码:

FILE *rc;
...
rc = fopen ( path, "a" );

path 定义如下:

char path [ sizeof ( getenv ("HOME") ) + 8]; /* 8 is the length of "/.bashrc" and "/.tcshrc" which are the .*rc files with the longest names */
strcpy ( path, getenv ("HOME") );
...
if ( <check for shell> ) {
    strcat ( path, "/.*rc" );
}

这是调用 fopen() 之前的输出:

${HOME}/.*rc (for example /home/user/.bashrc)

之后:

"$HOME" + square + \t + "rc"

...发挥您的想象力。

为什么 fopen() 改变了 path?我做错了什么或者这是一个已知的错误(我没有在网上找到任何东西而且手册页也没有提到它?)

最佳答案

您需要使用 strlen(getenv("HOME")),而不是 sizeof(getenv("HOME"))getenv 返回一个指针,而不是一个数组(在 C 中不可能返回一个数组),所以 sizeof 返回一个指针的大小,这可能只是 4

此外,您需要为所有字符串的尾随 0 字节留出空间。如果您要附加 8 个字符的字符串,如 "/.bashrc",则需要在分配 path 时将 9 添加到主目录的长度。所以应该是:

char path [ strlen ( getenv ("HOME") ) + 9];

关于c - fopen() 破坏路径参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25374507/

相关文章:

c - 结构体可以包含的成员数量或变量类型是否有大小限制?

c - 如何在内核源文件中包含 math.h #include <math.h>?

c++ - 通过 sscanf 读取全名

c - MIPS32字数组

c - 为什么 sizeof(long long) 返回 8?

c - C 中的结构体大小

c - 在 while 循环 C 外访问变量

iphone - 在 xcode/objective-c 项目中使用 C 文件

c - 找出整数

c - 在c中使用qsort进行排序