C fopen()会损坏路径参数

C fopen()会损坏路径参数,c,C,当将变量传递给fopen()而不是字符串文本时,我遇到了一个奇怪的错误。下面是一段令人不快的代码: FILE *rc; ... rc = fopen ( path, "a" ); 路径的定义如下所示: char path [ sizeof ( getenv ("HOME") ) + 8]; /* 8 is the length of "/.bashrc" and "/.tcshrc" which are the .*rc files with the longest names */ strc

当将变量传递给
fopen()
而不是字符串文本时,我遇到了一个奇怪的错误。下面是一段令人不快的代码:

FILE *rc;
...
rc = fopen ( path, "a" );
路径的定义如下所示:

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" );
}
及之后:

"$HOME" + square + \t + "rc"
。。。发挥你的想象力


为什么
fopen()?是我做错了什么,还是这是一个已知的bug(我没有在网上找到任何东西,手册页上也没有提到它?

你需要使用strlen(getenv(“HOME”)
,而不是
sizeof(getenv(“HOME”)
getenv
返回指针,而不是数组(不可能在C中返回数组),因此
sizeof
返回指针的大小,可能只是
4

此外,您还需要为所有字符串的尾部
0
字节留出空间。如果要添加8个字符的字符串,如
“/.bashrc”
,则需要在分配
路径时将
9
添加到主目录的长度。因此,它应该是:

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

您需要使用strlen(getenv(“HOME”)
,而不是
sizeof(getenv(“HOME”))
getenv
返回指针,而不是数组(不可能在C中返回数组),因此
sizeof
返回指针的大小,可能只是
4

此外,您还需要为所有字符串的尾部
0
字节留出空间。如果要添加8个字符的字符串,如
“/.bashrc”
,则需要在分配
路径时将
9
添加到主目录的长度。因此,它应该是:

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

我还没有仔细查看其余部分以确定,但乍一看,
sizeof(getenv(“HOME”))
似乎是个问题。看起来您真的想要
strlen
,而不是
sizeof
。您创建
path
的方式可能以某种方式调用了未定义的行为,导致它在
fopen
中损坏。我没有仔细查看其余部分以确定,但乍一看,
sizeof(getenv(“HOME”))
看起来是个问题。看起来您确实想要
strlen
,而不是
sizeof
。您创建
path
的方式可能以某种方式调用了未定义的行为,导致它在
fopen
中损坏
strcat
将写入空字节,但是在
路径
数组中为它留出足够的空间仍然取决于您。
strcat
将写入空字节,但在
路径
数组中为它留出足够的空间仍然取决于您。