无法访问内存中的位置

时间:2019-06-12 18:16:17

标签: c file fread

我正在尝试读取C语言中32个字节的二进制文件,但是在运行程序时,我不断收到“分段错误(代码已转储)”, 如果有人可以指出我哪里出了问题可以帮助我,那将是很好的。 我的代码如下:

int main()
{


   char *binary = "/path/to/myfiles/program1.ijvm";
   FILE *fp;
   char buffer[32];

   // Open read-only
   fp = fopen(binary, "rb");

   // Read 128 bytes into buffer
   fread (buffer, sizeof(char), 32, fp);



   return 0;
 }

3 个答案:

答案 0 :(得分:1)

这是因为路径。确保"/path/to/myfiles/program1.ijvm"指向现有文件。 您应该始终检查fopen的返回值。

\\Open read-only
fp = fopen(binary, "rb");
if(fp==NULL){
    perror("problem opening the file");
    exit(EXIT_FAILURE);
}

还请注意,您正在读取缓冲区中的32个字节,而不是注释中的128个字节。

答案 1 :(得分:1)

必须检查fopen()的返回结果。

我假设您在fread()调用中遇到段错误,因为您的数据文件不存在或无法打开,并且您正在尝试使用NULL FILE结构。

请参阅以下安全代码:

#include <stdio.h>
#include <stdint.h>

#define SIZE_BUFFER      32

int main()
{
   char *binary = "data.txt";
   FILE *fp = NULL;
   char buffer[SIZE_BUFFER];

   // Open read-only
   fp = fopen(binary, "rb");

   // Read SIZE_BUFFER bytes into buffer
   if( fp )
   {
        printf("Elements read %ld\n", fread (buffer, sizeof(char), SIZE_BUFFER, fp));
        fclose(fp);
   }
   else
   {
        // Use perror() here to show a text description of what failed and why
        perror("Unable to open file: ");
   }
   return 0;
 }

当我执行此代码时,它不会崩溃,并且在打开文件时将打印读取的元素数,或者在无法打开文件时将显示“无法打开文件”。

如注释中所述,您还应该关闭正在退出的文件。您可以做的另一件事是:

FILE *fp = fopen(.....);

无需在两个单独的步骤中进行声明和分配。

答案 2 :(得分:0)

有两个可能的原因

  1. fopen(3)函数由于某种原因而失败,这意味着fp为NULL,然后您尝试在fread(3)中使用空指针。这可能会崩溃。 @OznOg已经给出了一个微妙的提示,可以朝这个方向前进。
  2. 如果fopen调用成功(即,调用fpfopen不为NULL),由于您正在将32个字符读入变量{{ 1}},而binary仅初始化了30个字符。