2015-07-13 68 views
0

我试图建立在C路径将指向建立在C路径使用GETENV

char *getenv( 
    const char *varname 
); 
wchar_t *_wgetenv( 
    const wchar_t *varname 
); 
char *appData = getenv("AppData"); //so far so good 

char *myURL; 
myURL = (char *)malloc(sizeof(char)); 

//when I comment the next two lines, everything is ok, but if I uncomment them I get tons of errors 
strcpy(myURL, appData); 
strcat(myURL, "/some/path.xx"); 

FILE *myFile = fopen(myURL, "r"); 

有什么提示我该如何做到这一点?有些日子我一直在为此苦苦挣扎,我还无法修复它。

我也知道像另一个可能性:SHGetSpecialFolderPathSHGetFolderPath()SHGetKnownFolderIDList(),但我不能,因为我没有那么先进的使用它们。

+0

您还应该为读者带来这些错误。 – asgs

+0

如果考虑'SHGetFolderPath',您应该将您的问题标记为Windows特定的。 –

+0

好的。我还会添加另一个标签。 –

回答

4

sizeof(char)始终为1

所以

myURL = (char *)malloc(sizeof(char)); 

分配只有一个字节。这还不够。你应该总是测试malloc对失败,而you should not cast the result of malloc编码在C(和在C++中,更好地使用std::string或至少operator new)。

当然,你需要#include所有的<stdlib.h>(用于malloc & getenv & exit ...)和<stdio.h>(用于fopen & perror ...)& <string.h>(用于strlenstrcatstrcpy ....)

而且您不确定getenv("AppData")是否成功返回非NULL字符串。

所以,你应该尝试:

char *appdata = getenv("AppData"); 
if (!appdata) 
    appdata="/some/default/path"; 
size_t appdatalen = strlen(appdata); 
char* restpath= "/some/path.xx"; 
size_t restpathlen = strlen(restpath); 
size_t fullpathlen = // 1 additional byte for terminating \0 
    appdatalen+restpathlen+1; 
char *fullpath = malloc(fullpathlen); 
if (!fullpath) { perror("malloc"); exit(EXIT_FAILURE); }; 
strcpy (fullpath, appdata); 
strcat (fullpath, restpath); 
FILE *myFile = fopen(fullpath, "r"); 

我使用fullpath,不myURL,因为fopen不能URL S(像http://some.host.org/some/path)处理。如果你需要处理真正的URL,你需要一些HTTP客户端库,如libcurl

您可能不会分配堆fullpath使用本地缓存PATH_MAX个字符。另请参阅this thread

不要忘记,如果使用GCC所有警告编译&调试信息(例如,与gcc -Wall -Wextra -g,并学习如何使用调试器(如gdb)。像-fsanitize=address其他编译器选项可能会有所帮助。添加调试工具像valgrind也是有帮助的。有些工具可能无法使用在某些操作系统(在C初学者,我建议使用Linux)。

阅读undefined behavior & buffer overflow

+0

那么,应该怎么正确使用'的malloc()'在这种情况下?我应该使用'myURL =(的char *)malloc的(256 *的sizeof(char)的);'?我已经试过这种方式,而且我得到了完全相同的东西。 –

+0

@Alexander应使用'myURL = malloc的(256);'分配一个字符串的255最大长度因为'的sizeof(char)的'是1和不应该从'malloc'投返回值。但Basile的答案更好,因为它实际上计算了需要分配的字节数。 –

+0

我明白了。我会尝试你的方式@Basile。 “URL”只是一个错字。应该有'路径'而不是。 –