误差 - 分段错误

时间:2016-02-09 05:19:47

标签: c pointers fwrite fread

这是我的代码 文件名 filewrite.c

#include<stdio.h>
#include <stdlib.h>
void main()
{

    int *p; 
    *p = 5;
    FILE *fp1 = fopen("sample.txt","w");
    fwrite(&p,sizeof(int),1,fp1);
    fclose(fp1);

    printf("\n Value of p written into the file is :%d \n",*p);

 int *q;
 FILE *fp2 = fopen("sample.txt","r");
 fread(&q,sizeof(int),1,fp2);
 fclose(fp2);

 printf("\n Value of q read from the file is :%d \n",*q);

 }

在linux上的终端上看到的输出:

$>gcc -o filewrite.o filewrite.c

$>filewrite.o

$>Segmentation fault (core dumped)

我能够看到写出的文件sample.txt。但无法理解为什么会有核心转储。

3 个答案:

答案 0 :(得分:0)

您需要更改

fread(&q,sizeof(int),1,fp2);

fread(q,sizeof(int),1,fp2);

fread的第一个参数是void *,您传递的是pointer to pointer to int

并为指针p

分配内存
int *p;
p = malloc(sizeof(int));
{p>同样适用于q

int *q;
q = malloc(sizeof(int));

答案 1 :(得分:0)

在您的代码中

int *p; 
*p = 5;
当您尝试写入单位化内存时,

调用undefined behavior。如果没有明确的分配,p指向某些内存地址,这很可能无法从您的程序中访问。

您需要先将内存分配给p,然后再将其取消。

也就是说,您对fwrite()fread()的使用存在问题。您正在将指针指针传递给int,而您需要将指针传递给void

如果您将pq的类型从int *更改为int,我相信这样可以解决您的问题。

那就是说,

  • void main()至少应该int main(void)符合标准。
  • 在使用返回的文件指针之前,始终检查fopen()的返回值是否为NULL,以确保成功。

答案 2 :(得分:0)

正如你们所建议的那样,我修改了我的代码,并且能够获得正确的输出。 。非常感谢您的时间..

#include<stdio.h>
#include <stdlib.h>
int main()
{

int *p; 
p = malloc(sizeof(int));
*p = 5;
FILE *fp1 = fopen("sridhar.txt","w");
 fwrite(p,sizeof(int),1,fp1);
 fclose(fp1);

 printf("\n Value of p written into the file is :%d \n",*p);

int *q;
FILE *fp2 = fopen("sridhar.txt","r");
q = malloc(sizeof(int));
fread(q,sizeof(int),1,fp2);
fclose(fp2);

 printf("\n Value of q read from the file is :%d \n",*q);

 return 0;
 }

守则的输出如下:

写入文件的p的值是:5  从文件中读取的q值为:5

再次感谢您的帮助@Saurav和Haris