fopen()破坏了path参数

时间:2014-08-19 01:46:48

标签: 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?我做错了什么或这是一个已知的错误(我没有在网上找到任何东西,手册页没有提到它?)

1 个答案:

答案 0 :(得分:6)

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

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

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