鱼C论坛

 找回密码
 立即注册
查看: 2044|回复: 2

[已解决]求助!!!Segmentation fault!!(* *)

[复制链接]
发表于 2018-3-22 12:30:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *reverse_str(char *str){
        char *start = str;
        char *end = str+strlen(str)-1;
        char ch;
        
        if(str != NULL){        
                while(start < end){
                        ch = *start; 
                        *start++ = *end; 
                        *end-- = ch;
                }
        }
        return str;
}

int main()
{
        char * str = "ABC";
        printf("original ::%s\n", str);
        
        str = reverse_str(str);

        printf("reverse ::%s\n", str);
        return 0;
}
最佳答案
2018-3-22 17:15:09
本帖最后由 风扫地 于 2018-3-22 17:49 编辑

1.char * str = "ABC";
这里开辟了"ABC"的空间,并且让str指针指向他,部分编译器会把“ABC”分配在静态区,只让读不让写,而你在reverse_str函数中用start 指针指向了"ABC"并且对这部分区域进行了写操作,涉及读写权限问题,不同环境不同编译器有不同规定比如你用的gcc编译出来就不让读,我用lcc编译又可以运行出结果,限于个人能力,无法展开叙述。

2.如果我们确定某段字符串只会用来读的时候,通常可以用char * str = "ABC";
如果我们不确定某段字符串只会用来读的时候,一般用字符数组存放,比如你这里可以这样定义:
char str[4] = "ABC";
此时 “ABC”分配在局部变量对应的栈中或者全局变量区中,可读可写。。不如改下试试



参考:https://www.cnblogs.com/silence-hust/p/4487026.html



(1)错误的访问类型引起


#include <stdio.h>

#include <stdlib.h>

int main()

{

    char *c = "hello world";

    c[1] = 'H';

}
  上述程序编译没有问题,但是运行时弹出SIGSEGV。此例中,”hello world”作为一个常量字符串,在编译后会被放在.rodata节(GCC),最后链接生成目标程序时.rodata节会被合并到text segment与代码段放在一起,故其所处内存区域是只读的。这就是错误的访问类型引起的SIGSEGV。

无法打印

无法打印
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-22 17:15:09 | 显示全部楼层    本楼为最佳答案   
本帖最后由 风扫地 于 2018-3-22 17:49 编辑

1.char * str = "ABC";
这里开辟了"ABC"的空间,并且让str指针指向他,部分编译器会把“ABC”分配在静态区,只让读不让写,而你在reverse_str函数中用start 指针指向了"ABC"并且对这部分区域进行了写操作,涉及读写权限问题,不同环境不同编译器有不同规定比如你用的gcc编译出来就不让读,我用lcc编译又可以运行出结果,限于个人能力,无法展开叙述。

2.如果我们确定某段字符串只会用来读的时候,通常可以用char * str = "ABC";
如果我们不确定某段字符串只会用来读的时候,一般用字符数组存放,比如你这里可以这样定义:
char str[4] = "ABC";
此时 “ABC”分配在局部变量对应的栈中或者全局变量区中,可读可写。。不如改下试试



参考:https://www.cnblogs.com/silence-hust/p/4487026.html



(1)错误的访问类型引起


#include <stdio.h>

#include <stdlib.h>

int main()

{

    char *c = "hello world";

    c[1] = 'H';

}
  上述程序编译没有问题,但是运行时弹出SIGSEGV。此例中,”hello world”作为一个常量字符串,在编译后会被放在.rodata节(GCC),最后链接生成目标程序时.rodata节会被合并到text segment与代码段放在一起,故其所处内存区域是只读的。这就是错误的访问类型引起的SIGSEGV。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-24 09:11:17 | 显示全部楼层
风扫地 发表于 2018-3-22 17:15
1.char * str = "ABC";
这里开辟了"ABC"的空间,并且让str指针指向他,部分编译器会把“ABC”分配在静态区 ...

受教了!不胜感激!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-1 17:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表