2012-02-05 17 views
9

私はC言語の基本的なことをしようとしていますが、私はセグメンテーションフォールトを取得し続けています。私がしたいのは、単語の文字を別の文字に置き換えることです。この例では、lをLに置き換えます。誰かが間違ったところを説明するのを助けることができますか?それは私が考える本当に基本的な問題でなければならない、私はちょうどなぜそれが動作しないのか分からない。私の出力の場合文字列の個々の文字要素を置き換えますC

#include<stdio.h> 
#include<stdlib.h> 

int main(int argc, char *argv[]) 
{ 
    char *string1; 

    string1 = "hello"; 
    printf("string1 %s\n", string1);  

    printf("string1[2] %c\n", string1[2]); 
    string1[2] = 'L'; 
    printf("string1 %s\n", string1); 

    return 0; 
} 

私は

string1のハロー
string1の[2] L
セグメンテーションフォールト

感謝を入手!

+0

String1は定数初期化子であるため、(ほとんどのシステムでは)読み取り専用メモリへのポインタです。最初にコピーせずにその文字列に書き込むことはできません。 – gaige

答えて

14
string1 = "hello"; 
string1[2] = 'L'; 

あなたcan't change string literals、それは未定義の動作です。リテラルと文字列リテラルが非修正された文字列に

char *string1; 
string1 = malloc(6); /* hello + 0-terminator */ 
strcpy(string1, "hello"); 

/* Stuff. */ 

free(string1); 
+0

よろしくお願いします!私はこれを行かせます。 – user1163974

+0

大きなものはありませんが、mallocとstrcpyの呼び出しの代わりにstrdup( "hello")を使うことができます。 strdupこれをあなたのためにやってください。 – Zoneur

+0

@Zoneurよ、私はしばしば 'strdup'を勧めますが、標準ではないので問題になることがあります。 – cnicutar

3
char *string1; 
string1 = "hello"; 

string1ポイント:

char string1[] = "hello"; 

または多分:これを試してみてください。

できることは、文字列リテラルの要素で配列を初期化することです。

char string1[] = "hello"; 

string1配列の要素は変更可能です。

リテラルは、おそらくメモリの読出し専用セクションに保存されているとしようとしているので、あなたが得る string1[]="hello"; セグメンテーションフォールトが使用する代わりにC. に未定義の動作である文字列リテラルを変更しようとしている
0
string1[2] = 'L'; 

それに書き込むと、未定義の動作が発生します。

1
char *string1 = "hello"; 

コードを実行すると、文字列リテラルは読み取り専用のセクションになります。 OSはコードがそのメモリブロックを変更することを許可しないので、seg-faultが発生します。

char string1[] = "hello"; 

コードを実行すると、文字列リテラルがスタックにプッシュされます。

関連する問題