尝试通过指针到指针函数调用为字符串分配内存时出现分段错误
Segmentation fault when trying to allocate memory for a string via a pointer-to-pointer function call
我启动我的字符串并像这样调用我的函数:
int main() {
...
char *fileBuffer;
readFileToBuffer("/tmp/file.txt", &fileBuffer);
...
}
这个函数的作用是获取file.txt
的内容,放入fileBuffer
变量中。因为 file.txt
的内容是动态的,所以我在 readFileToBuffer()
函数中为 fileBuffer
动态分配内存,如下所示:
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);
...
}
这导致了分段错误。我用谷歌搜索了一下,这似乎是在函数内部分配内存的正确方法。
知道为什么会这样吗?
在您的 readFileToBuffer()
代码中,fileBuffer
的类型为 char **
并且您的函数被称为 readFileToBuffer("/tmp/file.txt", &fileBuffer);
那么你已经正确地将内存分配给 readFileToBuffer()
中的 *fileBuffer
[ 所以这会反映到 main()
[=41 中的 fileBuffer
=]].因此,您需要将 *fileBuffer
传递给 fread()
以将文件 的内容读取到 由 *fileBuffer
.
指向的内存中
你需要改变。
fread(fileBuffer, fileSize, 1, reqFile);
至
fread(*fileBuffer, fileSize, 1, reqFile); // notice the *
也就是说,
- 始终检查
malloc()
的 return 值是否成功。
main()
的推荐签名是 int main(void)
。
我启动我的字符串并像这样调用我的函数:
int main() {
...
char *fileBuffer;
readFileToBuffer("/tmp/file.txt", &fileBuffer);
...
}
这个函数的作用是获取file.txt
的内容,放入fileBuffer
变量中。因为 file.txt
的内容是动态的,所以我在 readFileToBuffer()
函数中为 fileBuffer
动态分配内存,如下所示:
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);
...
}
这导致了分段错误。我用谷歌搜索了一下,这似乎是在函数内部分配内存的正确方法。
知道为什么会这样吗?
在您的 readFileToBuffer()
代码中,fileBuffer
的类型为 char **
并且您的函数被称为 readFileToBuffer("/tmp/file.txt", &fileBuffer);
那么你已经正确地将内存分配给 readFileToBuffer()
中的 *fileBuffer
[ 所以这会反映到 main()
[=41 中的 fileBuffer
=]].因此,您需要将 *fileBuffer
传递给 fread()
以将文件 的内容读取到 由 *fileBuffer
.
你需要改变。
fread(fileBuffer, fileSize, 1, reqFile);
至
fread(*fileBuffer, fileSize, 1, reqFile); // notice the *
也就是说,
- 始终检查
malloc()
的 return 值是否成功。 main()
的推荐签名是int main(void)
。