您好,欢迎来到[编程问答]网站首页   源码下载   电子书籍   软件下载   专题
当前位置:首页 >> 编程问答 >> C/C++ >> 简单的几行代码报 Segmentation fault

简单的几行代码报 Segmentation fault

来源:网络整理     时间:2016/6/23 23:02:52     关键词:

关于网友提出的“ 简单的几行代码报 Segmentation fault”问题疑问,本网通过在网上对“ 简单的几行代码报 Segmentation fault”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题: 简单的几行代码报 Segmentation fault
描述:

#include 
#include 
void strcat1(char *c1,char *c2){
    int i,j;
    i = j = 0;
    while(*c1)
        c1++;
    while(*c1++ = *c2++){//报错行
        ;
    }
}
void strcat2(char *s,char *t){
    int i,j;
    i = j = 0;
    while(s[i])
        i++;
    while(s[i] = t[j] )//报错行
        i++,j++;
}
void strcpy(char *s1,char *s2){
    int i ;
    i = 0;
    while(s2[i] !='\0'){
        s1[i] = s2[i];//报错行
        i++;
    }
}
int main()
{
    printf("Hello world!\n");
    char *s1 ="I love " ,
    *s2 = "Mayday!";
    printf("%s\n",s2);
    strcpy(s1,s2);
  //  strcat2(s1,s2);
    printf("%s\n",s1);
    return 0;
}
不管调用上面三个方法中的哪一个都会报 Segmentation fault   运行环境 win8,IDE codeblocks
是我非法调用指针还是内存溢出? 初学搞不懂指针


解决方案1:

引用 7 楼 plumage55 的回复:
Quote: 引用 4 楼 dnvycumt3 的回复:

字符串字面值确实是存放在只读区,是不能改变其值的;而字符数组是存放在栈区,所以可以改变其值。

可以理解为指针指向的是字符串的地址 对字符串只有读的权限 没有写的权限吗?

是的,所以才叫只读区嘛,这一片内存区都是只读的。字符串的字面值和const常量都是放在只读区。我们都知道const变量是不能改变其值的,与它同在一个区的字符串常量当然也是不能改变值的。 解决方案2:

传入的内存地址需要有访问权限+空间足够大。

解决方案3:

字符串字面值确实是存放在只读区,是不能改变其值的;而字符数组是存放在栈区,所以可以改变其值。

解决方案4:

strcat中是你的s1在while(*c1)c1++;后指针指向的地址没有内存空间来存放数据
“I love”是存在只读属性数据区,不能做strcpy,
吧你的  char *s1 ="I love "改为char s1[20]="I love "

解决方案5:

//char *s1 = "I love" 改成  
char s1[20] = "I love"; //因为有字串符连接操作,所以多分配一点

以上介绍了“ 简单的几行代码报 Segmentation fault”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/2016948.html

相关图片

相关文章