【问题标题】:Why does fread segfault?为什么 fread 段错误?
【发布时间】:2016-07-16 09:57:12
【问题描述】:

我的任务是为 .iso 文件系统中的文件实现 ls 函数。我需要使用 fread 但它是段错误的。我知道该文件存在并且我知道其中有数据。我有调用 fread 的格式,我设置如下

static void ls(File *file, int32_t root_dir_size)
{
   void* sector;
   int result;
   result = fread(sector, 1, 1, file);
}

为什么会出现这个段错误?我是 C 新手,我来自 C++,所以不确定我在这里缺少什么。

【问题讨论】:

  • sector 未初始化。 File --> FILE ?
  • 您在 C++ 中也会遇到同样的问题。
  • sector 需要指向一个空的存储区域。来自 malloc(). 的数组或内存块

标签: c linux


【解决方案1】:

fread 需要内存来存放它正在读取的数据。该内存由第一个参数指向,在您的情况下为sector。但是,您还没有初始化sector。您将需要分配一些内存,在这种情况下只需一个字节并让sector 指向它。例如:

void *sector = malloc(1);

和往常一样,不要忘记在使用完内存后释放它。

【讨论】:

  • 好的,感谢您的澄清。因此,在 C 中,如果我声明一个指针,我必须始终分配内存,或者这只是 void 指针的情况?
  • 你可以有一个指向任何东西的指针,malloc'd内存,一个现有的变量,甚至函数。使用分配的内存可能是最常见的用途。这是相当罕见的,所以实际上声明了一个 void 指针。大多数指针都是有类型的(原始类型、结构等)。 fread 采用 void 指针,因为它只是将数据逐字节写入指向的内存中。 void 用于表明指针的类型无关紧要,您只需要使用某种指针即可。
  • 你特指可以指向任何东西的空指针?
  • 我的意思是你可以拥有int x = 0; int *xPtr = &x; 只是为了说明你可以拥有一个指针而不涉及malloc。
  • 为什么不直接声明一个局部变量并将其地址传递给函数呢?这个函数似乎不需要动态分配。
猜你喜欢
  • 2021-07-24
  • 2013-09-16
  • 2013-02-26
  • 2017-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多