我正在做"c编程语言“练习2.4,它删除s1中与字符串s2中的任何字符匹配的每个字符。但是,如果我将Main function中的定义从char c1[ ]="abcde"更改为char *c1="abcde",则会出现分段错误(核心转储)。知道为什么吗?
#include<stdio.h>
#define UNREPEAT 1
#define REPEAT 0
void squeeze(char *s1,char *s2);
void main(){
char c1[]="abcde";
char c2[]="cd";
printf("c1 is %s\n",c1);
squeeze(c1,c2);
printf("the final result is %s\n",c1);
}
void squeeze(char *s1,char *s2){
int i,j,judge;
int k=0;
for(i=0;*(s1+i)!='\0';i++){
judge=UNREPEAT;
for(j=0;*(s2+j)!='\0';j++){
if (*(s1+i)==*(s2+j)){
judge=REPEAT;
break;}
}
if( judge==UNREPEAT){
* (s1+k)=*(s1+i);
k++;}
}
*(s1+k)='\0';
}发布于 2015-01-16 02:44:50
因为
char c1[] = "abcde";声明一个数组,它是可读和可写的,并且总是有6个字节(如果你考虑终止'\0'),你不能扩展它,但当然你可以用它来存储更少的字节。
而
char *c1 = "abcde";是静态字符串文字,则不应对其进行修改,应始终使用const限定符声明字符串文字,这样,如果您试图修改其内容(这是非法的),编译器会发出警告,只需使用
const char *c1 = "abcde";发布于 2015-01-16 02:45:02
char *c1="abcde"这是一个字符串文字,它是只读的,在你的函数中,你试图改变它的内容,这样你可能会遇到seg错误。
而另一种情况
char c1[] = "abcde";您正在堆栈上分配内存,该堆栈的内容可以修改。
PS:字符串文字是只读的
https://stackoverflow.com/questions/27970677
复制相似问题