c语言代码出现segmentation fault 的原因是什么

各位大神!求助!以下要检测一个单词是否是回文单词,这个代码可以进行编译,但是运行的时候出现错误提示:segmentationfault(coredumped)请问是哪个地... 各位大神!求助!
以下要检测一个单词是否是回文单词,这个代码可以进行编译,但是运行的时候出现错误提示:
segmentation fault(core dumped)
请问是哪个地方出现错误了呢,谢谢!

#include <stdio.h>
int main(){
char str1[20],str2[20];
int j,i;
printf("Please enter a word:");
scanf("%s",str1[20]);

for(i=0;str1[i]!='\0';i++);
i=i-1;
for(j=0;i>=0;i--,j++){
str2[j]=str1[i];
}
j=j++;
str2[j]='\0';
printf("%s\n",str2[20]);
if(str1[20]==str2[20]){
printf("The string is a palindrome.\n");
}
else{
printf("The string is not a palindrome.\n");
}

return 0;
}
展开
 我来答
dmvfbxhhxd
2018-03-30 · TA获得超过9549个赞
知道小有建树答主
回答量:181
采纳率:100%
帮助的人:31.8万
展开全部

segmentation fault 即段错误,一般都是出现了非法的地址写法操作导致的。

常见的几种情况:

1、空指针访问。

如果指针为空(NULL), 那么对空指针的读写操作都会导致segmentation fault。

2、指针指向非法区域后的写操作。

C语言的指针指向了非法区域,然后对其写入,会带来不可预知后果,最严重的就是程序崩溃,此时也是segmentation fault。

3、常量空间破坏。

比如常量字符串,如果修改其内容,则会出现segmentation fault。

4、在一些比较老的操作系统上,非对齐访问也可能导致segmentation fault。

风若远去何人留
2017-06-27 · 知道合伙人互联网行家
风若远去何人留
知道合伙人互联网行家
采纳数:20412 获赞数:450132
专业C/C++软件开发

向TA提问 私信TA
展开全部

segmentation fault 即段错误,一般都是出现了非法的地址写操作导致的。

常见的有如下几种情况:

1、空指针访问。

如果指针为空(NULL), 那么对空指针的读写操作都会导致segmentation fault。

char *p = NULL;
printf("%c",*p);//读操作
*p='A';//写操作。

两种操作任意一种都会导致segmentation fault。

2、指针指向非法区域后的写操作。

C语言的指针指向了非法区域,然后对其写入,会带来不可预知后果,最严重的就是程序崩溃,此时也是segmentation fault。

比如

char *p = malloc(100);//申请100字节空间
p+=1000;//超出申请范围。
*p='a';//此时就有可能出现segmentation fault

或者

char *p = malloc(100);//申请内存
free(p);//释放
*p = 'a';//此时p指向空间已经释放,有可能被系统用作其它功能,对其赋值就可能出现segmentation fault。

3、常量空间破坏。

比如常量字符串,如果修改其内容,则会出现segmentation fault。

char *p = "abcdef";//p指向常量字符串。
p[1] = 'M';//修改常量空间,导致segmentation fault

4、在一些比较老的操作系统上,非对齐访问也可能导致segmentation fault。

比如

int a[2];
char *p1 = (char *)a;//指向数组首地址。
int *p2 = (int *)(p1+1);//实际上将a[0]和a[1]的各一部分,组成了一个新的int。 这时对p2的访问,包括读写,都属于非对齐访问。
*p2=3;//此时有可能出现segmentation fault
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2014-10-25
展开全部
C的数组下标从0开始,char str[20]的最后一个元素是str[19]

scanf("%s",str1[20]);

printf("%s\n",str2[20]);
if(str1[20]==str2[20]){

这几句都越界访问内存了,会产生一个SIGSEGV信号引发段错误
更多追问追答
追问
但是我输入的字符串都不会超过15个字符,按理说应该不会超出吧,那么请问这个时候要怎么解决呢,非常谢谢!
追答
老老实实按语言标准写代码,不要做这种拍脑门子的假设
恩,还有问题,你的scanf和printf写的都是错的,好好查一下%s的用法和C风格字符串的意义吧
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式