无法访问内存中的某个位置
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(.....);
而不是在两个单独的步骤中声明和分配。
有两个可能的原因
fopen(3)
函数由于某种原因失败,这意味着fp
为NULL,然后你试图在fread(3)
中使用null-pointer。这可能会崩溃。 @OznOg 已经给出了一个微妙的提示来研究这个方向。
- 如果
fopen
调用成功(即调用 fopen
后 fp
为 non-NULL),代码仍然会崩溃,因为您正在将 32 个字符读入变量 binary
,而 binary
只用 30 个字符初始化。
我试图在 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(.....);
而不是在两个单独的步骤中声明和分配。
有两个可能的原因
fopen(3)
函数由于某种原因失败,这意味着fp
为NULL,然后你试图在fread(3)
中使用null-pointer。这可能会崩溃。 @OznOg 已经给出了一个微妙的提示来研究这个方向。- 如果
fopen
调用成功(即调用fopen
后fp
为 non-NULL),代码仍然会崩溃,因为您正在将 32 个字符读入变量binary
,而binary
只用 30 个字符初始化。