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有没有对用户程序运行内存范围的规定。哪些内存地址是可以访问的,哪些是不能访问的呢??
展开
 我来答
Xenium
2011-10-30 · 超过11用户采纳过TA的回答
知道答主
回答量:33
采纳率:0%
帮助的人:39万
展开全部
注意到你是要求打开/etc/passwd,你确定你有权限?

我刚在mac上编译这个文件,用sudo执行没有问题。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式