2016-05-11 9 views
-4

私はこの2つの配列を持っていますが、codeblocksはビルドエラーを表示しませんが、実行するたびに "Segmention fault"となり、プログラムをシャットダウンします。私はの名前1から値を変更することはできませんが、の名前2をこのように変更すると、この作業を行う方法はありますか?はいの場合どうすればいいですかの名前はのためにtrocaが使えますか?charポインタの配列内の文字列を変更する

void troca(char* frase){ 
    unsigned i=0; 
    while(*(frase+i)!='\0') { 
     if(*(frase+i)=='O') { 
      *(frase+i)='0'; 
     } 
    i++; 
    } 
} 

int main(){ 
    char *names1[]={"JOAO","MANUEL","ROBERTO","ZE"}; 
    char names2[][51]={"JOAO","MANUEL","ROBERTO","ZE"}; 
    unsigned i; 
    for(i=0;i<4;i++) { 
     troca(names2[i]); 
    } 
    return 0; 
} 
+4

google _string literals_ –

+0

ここでは関係ありませんが、同じ文字列リテラルを指す2つの変数が同じメモリを共有している可能性があります。 1つを変更すると他のものも変更される可能性があります。 – sjsam

+0

*実際のコードを[最小限で完全で検証可能な例]として投稿してください(http://stackoverflow.com/help/mcve)。明らかにこれはあなたのコードではありません - もしそれがコンパイルされなければ、segfaultを生成することはできません。 –

答えて

0

差がある:

names1は、単に他の定義された特性せずに文字列のポインタの配列として宣言されています。ここで文字列リテラルを使用すると、実行可能ファイルのセクションに文字列リテラルが置かれます。読み取り専用です。コンパイラはこの方法で再利用できるためです。たとえば、char* a = "abc"; char* b = "abc";を使用すると、おそらくabは、等しいメモリアドレスを値として持ちます。つまり、これらを変更することはできないため、「セグメンテーション違反」が発生します(同じエラーの別の名前は「アクセス違反」です)。

names2は、文字の配列の配列として宣言されます。文字列リテラルを代入すると、文字列のデータが配列にコピーされます。コードにはconstというものがありませんので、配列は可変でなければならないので、char配列に格納されている文字列も同様に変更可能です。

関連する問題