无法访问内存中的某个位置

can't access a place in memory

我试图在 C 中读取一个 32 字节的二进制文件,但是当我 运行 我的程序时,我一直得到 "segmentation fault (code dumped)", 如果有人可以指出我哪里出错了来帮助我,那就太好了。 我的代码如下:

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

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

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

另请注意,您正在读取缓冲区中的 32 个字节,而不是您评论中所说的 128 个字节。

必须检查fopen()的return结果。

我假设您在 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;
 }

当我执行这段代码时,它不会崩溃,如果文件打开,它会打印读取的元素数,如果文件无法打开,它会打印 "Unable to open file"。

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

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

而不是在两个单独的步骤中声明和分配。

有两个可能的原因

  1. fopen(3)函数由于某种原因失败,这意味着fp为NULL,然后你试图在fread(3)中使用null-pointer。这可能会崩溃。 @OznOg 已经给出了一个微妙的提示来研究这个方向。
  2. 如果 fopen 调用成功(即调用 fopenfp 为 non-NULL),代码仍然会崩溃,因为您正在将 32 个字符读入变量 binary,而 binary 只用 30 个字符初始化。