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>
(用于strlen
,strcat
,strcpy
....)
而且您不确定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。
您还应该为读者带来这些错误。 – asgs
如果考虑'SHGetFolderPath',您应该将您的问题标记为Windows特定的。 –
好的。我还会添加另一个标签。 –