0

値で s1 を初期化し、後で squeeze() で初期化しようとしています。s1を変更しています。ポインターの初期化はセグ フォールトをスローしますが、配列バージョンは正常に動作します。ポインターバージョンでそれができるかどうか、そしてこれの何が問題なのか誰か教えてもらえますか? 私は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' ;

}
4

1 に答える 1

3

違いは次のとおりです。

宣言:

char s1[] = "xyz abc zzz" ; 

サイズ strlen(RHS) + 1 の配列を作成し、変更可能です。第二形態で

char *s1 = "xyz abc zzz"; 

s1変更不可能なメモリ領域にある文字列リテラルへのポインタです。したがって、文字列の変更は不正な操作です。

于 2013-08-24T20:11:06.983 に答える