URN Logo
UNIX Resources » Linux » China Linux Forum » C/C++编程版 » 33 » 问一个以前关于segmentation fault的问题
announcement 声明: 本页内容为中国Linux论坛的内容镜像,文章的版权以及其他所有的相关权利属于中国Linux论坛和相应文章的作者,如果转载,请注明文章来源及相关版权信息。
Resources
China Linux Forum(finished)
Linux Forum(finished)
FreeBSD China(finished)
linuxforum.net
  业界新闻与评论
  自由软件杂谈
  IT 人生
  Linux软件快递
  翻译作坊
  Linux图书与评论
  GNU Emacs/XEmacs
  Linux 中文环境和中文化
  Linux桌面与办公软件
  Linux 多媒体与娱乐版
  自由之窗Mozilla
  笔记本电脑上的Linux
  Gentoo
  Debian 一族
  网络管理技术
  Linux 安装与入门
  WEB服务器和FTP服务器
  域名服务器和邮件服务器
  Linux防火墙和代理服务器应用
  文件及打印服务器
  技术培训与认证
  Linux内核技术
  Linux 嵌入技术
  Linux设备驱动程序
  Linux 集群技术
  LINUX平台数据库
  系统和网络安全
  CPU 与 编译器
  系统计算研究所专栏
  Linux下的GUI软件开发
  C/C++编程版
  PHP 技 术
  Java&jsp技术
  Shell编程技术
  Perl 编 程
  Python 编 程
  XML/Web Service 技术
  永远的Unix
  FreeBSD世界
   
问一个以前关于segmentation fault的问题
问一个以前关于segmentation fault的问题 - backkom [2005-05-26 13:17 | 1,691 byte(s)]
 
 
 
 
 
Subject: 问一个以前关于segmentation fault的问题
Author: backkom    Posted: 2005-05-26 13:17    Length: 1,691 byte(s)
[Original] [Print] [Top]

http://www.linuxforum.net/forum/gshowflat.php?Cat=&Board=program&Number=414847&page=0&view=collapsed&sb=5&o=all

http://www.linuxforum.net/forum/showflat.php?Cat=&Board=program&Number=414749&page=&view=&sb=&o=&fpart=all&vc=1
看到了这个
====================
现有一程序如下:
main()
{
char *p="Hello";
strcat(p,"World");
printf("p is %s. ",p);
}
运行结果为segmentation fault
如果改成char p[]="Hello";就正确运行.
我不理解的是,为什么必须p在栈里就正确,在堆里就错误呢?
而且segmentation fault又如何解释呢?
====================

在回复中看到说segmentation fault的原因是
char *p="Hello" 就是char * const p = "Hello", p 指向的内容是不能改变的!
但是我了解的是char * const p是说指针p不能改变,怎么牵扯到p指向的内容不能改变呢,
如果把这里的strcat改成strcpy,程序是不是也是错误的呢,字符串常量的内存分配是怎么样的呢?
[Original] [Print] [Top]
Subject: Re: 问一个以前关于segmentation fault的问题
Author: teawater    Posted: 2005-05-26 13:33    Length: 752 byte(s)
[Original] [Print] [Top]
char *p="Hello";
不是在堆里
Hello在text段 你的指针指向其 可以读 但是不能写 因为text所在页面是没开写权限的 (可以通过mprotect将text设置为可写 那样就没有Segmentation fault了)
为了防止这里对其写 可以写成
const char *p="Hello";
const我认为主要是告诉编译器 这个指针指向的内容不能改 要是有代码想改就在编译的时候就报错
指针p不能改变 这里const管的是内容 指针的值它不管 你可以用:
int
main(int argc,char *argv[])
{
const char *a = "1";
printf("%s ",a);
a = "b";
printf("%s ",a);
return(0);
}
看看效果

BTW:这里编译器主要指gcc
----
读了这么多年的书 还是觉得幼儿园好混
[Original] [Print] [Top]
Subject: Re: 问一个以前关于segmentation fault的问题
Author: zhllg    Posted: 2005-05-27 04:51    Length: 699 byte(s)
[Original] [Print] [Top]
segmentation fault的原因是该进程尝试往只读区域写入,因此收到信号SIGSEGV而terminate
给你个小玩意,如果main()里只有*(char *)0xffffffff = '1'; 结果将是segmentation fault
可是现在是hihi
#include<stdio.h>
#include<signal.h>
#include<setjmp.h>

jmp_buf buf;

void handler(int s){
puts("hihi");
longjmp(buf, 1);
}

int main(){
signal(SIGSEGV, handler);
if(setjmp(buf))
goto out;
*(char *)0xffffffff = '1';
out:
return 0;
}
----
[Original] [Print] [Top]
Subject: Re: 问一个以前关于segmentation fault的问题
Author: littletiger    Posted: 2005-05-27 10:21    Length: 289 byte(s)
[Original] [Print] [Top]
这可能牵涉到编译器和连接器如何处理常量得问题,
我试过了,用gcc是不可以,但是如果用c++builder一般不会出现fault。c++builder常量也不是在栈里,肯定是在动态数据区了。
gcc编译的时候常量永远保存在代码段里面吗?一个常量可能只在一个函数里面用过一次,一直留在代码岂不是很浪费空间?
----
ldd3
[Original] [Print] [Top]
Subject: Re: 问一个以前关于segmentation fault的问题
Author: littletiger    Posted: 2005-05-27 10:26    Length: 136 byte(s)
[Original] [Print] [Top]
oh,函数会被多次调用的
刚才试了一下,vc中也会出现非法错误,和gcc差不多。
以前总是肆意滥用常量,看来这次得节俭一点了。
----
ldd3
[Original] [Print] [Top]
« Previous thread
还是关于内存泄漏问题
C/C++编程版
33
Next thread »
休闲小程序:打印数字金字塔
     

Copyright © 2007 UNIX Resources Network, All Rights Reserved.      About URN | Privacy & Legal | Help | Contact us
备案序号: 京ICP备05006143    webmaster: webmaster@unixresources.net
This page created on 2008-07-17 03:52:56, cost 0.059706211090088 ms.