【问题标题】:Segmentation fault when trying to allocate memory for a string via a pointer-to-pointer function call尝试通过指针到指针函数调用为字符串分配内存时出现分段错误
【发布时间】:2015-05-21 10:49:34
【问题描述】:

我启动我的字符串并像这样调用我的函数:

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);
...
}

这会导致分段错误。我搜索了一下,这似乎是在函数内部分配内存时的正确方法。

知道为什么会这样吗?

【问题讨论】:

  • 使用 valgrind 和 gdb,并发布您的调试信息
  • 再看看fread的电话。

标签: c pointers file-io segmentation-fault malloc


【解决方案1】:

在您的 readFileToBuffer() 代码中,fileBuffer 的类型为 char **,您的函数称为 readFileToBuffer("/tmp/file.txt", &fileBuffer);

那么你已经正确地将内存分配给readFileToBuffer() 中的*fileBuffer [所以这会反映到main() 中的fileBuffer]。因此,您需要将*fileBuffer 传递给fread() 以将文件的内容读入*fileBuffer 指向的内存中。

你需要改变。

fread(fileBuffer, fileSize, 1, reqFile);

fread(*fileBuffer, fileSize, 1, reqFile);  // notice the *

也就是说,

  1. 始终检查malloc() 的返回值是否成功。
  2. main() 的推荐签名是int main(void)

【讨论】:

  • 吹毛求疵:传递*fileBuffer(到fread())的需要并非直接源于“fileBuffer 的类型为char **”,而是源于事实该(要读入的内存)已分配给*fileBuffer(通过此调用*fileBuffer = malloc(fileSize + 1);)。
  • @alk 先生,更新了答案,请问您现在是否正确?
猜你喜欢
  • 2021-11-21
  • 1970-01-01
  • 2016-02-23
  • 1970-01-01
  • 2022-11-16
  • 1970-01-01
  • 2020-10-02
  • 2020-02-18
  • 2020-03-26
相关资源
最近更新 更多