|
|
|
|
| 问一个以前关于segmentation fault的问题 |
 问一个以前关于segmentation fault的问题 - backkom [ 2005-05-26 13:17 | 1,691 byte(s)]
 Re: 问一个以前关于segmentation fault的问题 - littletiger [ 2005-05-27 10:21 | 289 byte(s)]
 Re: 问一个以前关于segmentation fault的问题 - littletiger [ 2005-05-27 10:26 | 136 byte(s)]
 Re: 问一个以前关于segmentation fault的问题 - zhllg [ 2005-05-27 04:51 | 699 byte(s)]
 Re: 问一个以前关于segmentation fault的问题 - teawater [ 2005-05-26 13:33 | 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]
|
|
[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]
|
|
[Original]
[Print]
[Top]
|
这可能牵涉到编译器和连接器如何处理常量得问题,
我试过了,用gcc是不可以,但是如果用c++builder一般不会出现fault。c++builder常量也不是在栈里,肯定是在动态数据区了。
gcc编译的时候常量永远保存在代码段里面吗?一个常量可能只在一个函数里面用过一次,一直留在代码岂不是很浪费空间?
|
|
|
----
ldd3
|
|
[Original]
[Print]
[Top]
|
|
« Previous thread
还是关于内存泄漏问题 |
C/C++编程版
第33页 |
Next thread »
休闲小程序:打印数字金字塔 |
|