关于网友提出的“ 简单的几行代码报 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:
是的,所以才叫只读区嘛,这一片内存区都是只读的。字符串的字面值和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