我正在尝试用值初始化s1,然后在squeeze()中初始化。我正在改变s1。指针初始化会引发seg错误但阵列版本工作正常。有人能告诉我,如果我可以用指针版本做到这一点有什么问题吗?可能是因为我没有使用过malloc ??
int main() {
char s1[] = "xyz abc zzz" ; // this works fine.
// char *s1 = "xyz abc zzz"; // if i initialize like this it throws a seg fault.
char *s2 = "abx xxx xxx" ;
squeeze(s1,s2) ;
puts (s1) ;
return 0 ;
}
void squeeze(char *s1, char *s2 ) {
int i , j, k = 0;
for (i=0 ; s1[i] != '\0' ; ++i) {
for (j=0; s2[j] != '\0'; j++) {
if (s2[j] == s1[i])
break;
}
if(s2[j] == '\0')
s1[k++] = s1[i] ;
}
s1[k++] = '\0' ;
}
答案 0 :(得分:3)
区别在于:
宣言:
char s1[] = "xyz abc zzz" ;
创建一个大小为strlen(RHS)+ 1的数组,并且可以修改。第二种形式
char *s1 = "xyz abc zzz";
s1
是指向字符串文字的指针,该字符串文字位于不可修改的内存区域中;因此修改字符串是非法操作。