为什么会出现segmentation fault (段错误)

lanlvy 2014-03-10 02:30:57
int main(){
//char str[128];
//gets(str);
//char buf[]="abcdefg";
char *str;
str="abcde";
reverse(str);
printf("%s\n",str);
return 0;
}
为什么我用char buf[];时不时不出现段错误,而用char *str时出现段错误啊,
...全文
332 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiandingzhe 2014-03-11
  • 打赏
  • 举报
回复
引用 2 楼 u013702063 的回复:
str 使用之前先分配内存 str =(char)malloc(10*(char)); //应该是这样
和这个没关系。
jiandingzhe 2014-03-11
  • 打赏
  • 举报
回复
segmentation fault通常是内存非法访问,比如越过程序的界。 你的程序里,如果第一种,数组在函数栈上,用字符串常量向数组赋值,之后你操作在函数栈上的空间做reverse。 如果是第二种,你的指针指向常量,之后reverse操作的是常量区域的空间,那里是不可写的。现代操作系统会强制这一点。
blh 2014-03-11
  • 打赏
  • 举报
回复
看下面例子(linux),"abcde"是字符串常量,被分配到只读数据区 对于char *s1 = "abcde",仅仅把 "abcde"的地址赋值给s1,s1指向的数据区依旧是只读的,如果修改就会segement error 对于char s2[] = "abcde":s2是在fun()的堆栈上分配空间,然后把"abcde"内容赋值到s2的空间,这个空间是可读写的,修改所以没有问题 void fun() { char *s1 = "abcde"; char s2[] = "abcde"; } ==》 .file "demo.c" .section .rodata .LC0: .string "abcde" .text .globl fun .type fun, @function fun: .LFB2: pushq %rbp .LCFI0: movq %rsp, %rbp .LCFI1: //char *s1 = "abcde"; movq $.LC0, -8(%rbp) //char s2[] = "abcde"; movl .LC0(%rip), %eax movl %eax, -16(%rbp) movzwl .LC0+4(%rip), %eax movw %ax, -12(%rbp) leave ret
pix77 2014-03-10
  • 打赏
  • 举报
回复
呵呵,普遍会遭遇的问题,以后,就知道了
知行力 2014-03-10
  • 打赏
  • 举报
回复
学习了 还真没注意过这个问题
赵4老师 2014-03-10
  • 打赏
  • 举报
回复
#pragma comment(linker,"/SECTION:.rdata,RW")
//加这句可以让常量区可写,后果自负!
Guy_Fwakes 2014-03-10
  • 打赏
  • 举报
回复
二楼正解,详细解释为“abcdefg“存储的位置是常量区,对这块内存你是没有写权限的,但是你用str索引了它,企图修改它,所以报错!
江湖的传说 2014-03-10
  • 打赏
  • 举报
回复
str 使用之前先分配内存 str =(char)malloc(10*(char)); //应该是这样
图灵狗 2014-03-10
  • 打赏
  • 举报
回复
str="abcde"这样赋值的话,str相当于常量指针,其指向的内容不能被修改,所以会段错误。
引用 楼主 u012514171 的回复:
int main(){ //char str[128]; //gets(str); //char buf[]="abcdefg"; char *str; str="abcde"; reverse(str); printf("%s\n",str); return 0; } 为什么我用char buf[];时不时不出现段错误,而用char *str时出现段错误啊,

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧