linux段错误问题
我在虚拟机中做了一个实验,代码如下:#include<stdio.h>#include<stdlib.h>intmain(){FILE*pfile1,*pfile2;in...
我在虚拟机中做了一个实验,代码如下:
#include<stdio.h>
#include<stdlib.h>
int main()
{
FILE *pfile1,*pfile2;
int len,i=0;
char *a,ch;
pfile1=fopen("/etc/passwd","r+");
if(pfile1 == NULL)
{
printf("fopen fail\n");
exit(-1);
}
fseek(pfile1,0,SEEK_END);
len = ftell(pfile1);
rewind(pfile1);//求出文件长度
断点1 a=(char *)malloc(len);
断点2 while((ch=fgetc(pfile1))!=EOF)
{
*(a+i)=ch;
i++;
}
for(i=0;i<len;i++)
printf("%c",a[i]);
printf("\n");
close(pfile1);
}
我在调试的时候,如果不加a=(char *)malloc(len);这一句,会出现段错误,我用gdb调试,设置了断点1和断点2,在断点1 a的地址为0xbffff4 断点2的地址为0x938e170 。
问题如下:
1)段错误的出现是不是没用malloc分配内存,系统随机给出了0xbffff4的地址,这可能是内核的空间地址,导致段错误?
但是我看了下,linux的内核空间是4g内存中最高的1g,但是0xbffff4没在内核地址内,所以不知这个段错误该如何解释。
2)我查了下段错误的原因,网上说是访问了不该访问的内存地址,linux有没有对用户程序运行内存范围的规定。哪些内存地址是可以访问的,哪些是不能访问的呢?? 展开
#include<stdio.h>
#include<stdlib.h>
int main()
{
FILE *pfile1,*pfile2;
int len,i=0;
char *a,ch;
pfile1=fopen("/etc/passwd","r+");
if(pfile1 == NULL)
{
printf("fopen fail\n");
exit(-1);
}
fseek(pfile1,0,SEEK_END);
len = ftell(pfile1);
rewind(pfile1);//求出文件长度
断点1 a=(char *)malloc(len);
断点2 while((ch=fgetc(pfile1))!=EOF)
{
*(a+i)=ch;
i++;
}
for(i=0;i<len;i++)
printf("%c",a[i]);
printf("\n");
close(pfile1);
}
我在调试的时候,如果不加a=(char *)malloc(len);这一句,会出现段错误,我用gdb调试,设置了断点1和断点2,在断点1 a的地址为0xbffff4 断点2的地址为0x938e170 。
问题如下:
1)段错误的出现是不是没用malloc分配内存,系统随机给出了0xbffff4的地址,这可能是内核的空间地址,导致段错误?
但是我看了下,linux的内核空间是4g内存中最高的1g,但是0xbffff4没在内核地址内,所以不知这个段错误该如何解释。
2)我查了下段错误的原因,网上说是访问了不该访问的内存地址,linux有没有对用户程序运行内存范围的规定。哪些内存地址是可以访问的,哪些是不能访问的呢?? 展开
1个回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询