我启动我的字符串并像这样调用我的函数:
int main() {
...
char *fileBuffer;
readFileToBuffer("/tmp/file.txt", &fileBuffer);
...
}
此函数的目的是获取file.txt
的内容并将其放入fileBuffer
变量中。由于file.txt
的内容是动态的,因此我会在fileBuffer
函数中动态分配readFileToBuffer()
的内存,如下所示:
void readFileToBuffer(char *filePath, char **fileBuffer) {
...
FILE *reqFile = fopen(filePath, "r");
fseek(reqFile, 0, SEEK_END);
long fileSize = ftell(reqFile);
fseek(reqFile, 0, SEEK_SET);
*fileBuffer = malloc(fileSize + 1);
fread(fileBuffer, fileSize, 1, reqFile);
fclose(reqFile);
...
}
这会导致分段错误。我已经用Google搜索了,这似乎是在函数内部分配内存时的正确方法。
知道为什么会这样吗?
答案 0 :(得分:7)
在您的readFileToBuffer()
代码中,fileBuffer
的类型为char **
,您的功能称为readFileToBuffer("/tmp/file.txt", &fileBuffer);
然后你正确地将记忆分配给*fileBuffer
[]中的readFileToBuffer()
,以便反映到fileBuffer
中的main()
。因此,您需要将*fileBuffer
传递给fread()
,以便将文件的内容读入 *fileBuffer
指向的内存。
你需要改变。
fread(fileBuffer, fileSize, 1, reqFile);
到
fread(*fileBuffer, fileSize, 1, reqFile); // notice the *
那就是说,
malloc()
的返回值是否成功。main()
的推荐签名为int main(void)
。