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有没有对用户程序运行内存范围的规定。哪些内存地址是可以访问的,哪些是不能访问的呢??
展开
 我来答
zhakalamu
2011-11-03 · 超过30用户采纳过TA的回答
知道答主
回答量:87
采纳率:0%
帮助的人:72.2万
展开全部
linux内存管理把这个内存空间分为了两块 一块是0-3G的用户空间,一块是3G-4G的内核空间。一般的程序分配内存是在用户空间分配。所以,这个地址是正常的。
malloc分配内存的时候,是在一个线性区里面分配,每个程序都有属于自己的线性区。如果这个地址恰好分配在不属于自己进程的线性区里面。那么肯定是会报段错误。
段错误不是内核空间才会发生的事情。
用户程序只能访问属于自己的线性区,这个线性区是属于用户空间的。用户程序不能直接访问内核空间。
这些知识都是属于linux内核的。如果不清楚的话,可以看看内核方面的书。
呆呆211
2011-10-31
知道答主
回答量:50
采纳率:0%
帮助的人:42.6万
展开全部
个人觉得希望楼主再复习一下指针的那块知识,你可以试试:
int *p;
printf("%d",*p);
这个程序会的报段错误,原因和你的这个一样,是由于访问了
不该访问的地址。
如果想更详细的知道为什么的话看一下C语言的书吧
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式