2016-07-30 9 views
-1

誰かが私にこの行動を理解するのを助けることができます...?ポインタの出力は、私が期待したものではありません

私は出力がなければならないことを私は期待この

#include <stdio.h> 
int main() 
{ 
    char *ptr = "Hello"; 
    printf("%c ",++*ptr); 
    return 0; 
} 

のようなスニペットは、(L連想にも優先する++の順と*とRを念頭に置いて)持って

I (the letter I) 

しかしそうではなく、むしろプログラムがクラッシュします。

だからpls誰かが説明する、私はここで何が欠けていますか?

+1

文字列リテラルを変更しようとしています。これは未定義の動作です。 –

+0

@Paul Hankin、あなたはconstとして扱われているのですか? plsは少し – eRaisedToX

答えて

1

char * ptr = "Hello";

ptrは文字列リテラルなので、変更する必要はありません。

あなたは、変更の代わりに、配列を使用したい場合:

char ptr[] = "Hello"; 
printf("%c ",++*ptr); 

ptr、あなたの元のコードchar *ptr = "Hello";であることがconstのポインタではありません、それは何か他のものを指すように変更することができます。

文字列が読み取り専用メモリに格納されているため、ptrが指している場合は、ptrが指すデータを変更することはできません。 、

は一般的に、しかし、あなたはどこか別の場所を指すようにptrを変更することができ、それによって指されたデータを変更することができ、例えば、

char *ptr = "Hello"; // data cannot be modified by ptr 
char arr[] = "abcd"; 
ptr = arr;    // data can be modified by ptr 
printf("%c ",++*ptr); 
+0

ohkを説明します。それを得ましたが、それは* ptrがconstであることを意味しますか? – eRaisedToX

+0

OPコードでリテラルはどのように変更されますか? – ameyCU

+0

@ameyCU '++ * ptr = ++(* ptr)'その配列の最初の文字、すなわち 'H'を修正しようとします。 – artm

-1

あなたのコードはほとんどOKですが、それは若干の修正が必要です

#include <stdio.h> 
int main() 
{ 
    char *ptr = "Hello"; 
    printf("%c ",*(++ptr)); 
    return 0; 
} 

説明:あなたのコード(++*ptr)によると、それはが指すアドレスに値をインクリメントしますので、何が起こっています、ptr自体ではありません。しかし、ptrに格納されているアドレスをインクリメントするには、最初にインクリメントしてから、そのポインタを逆参照して、その値に格納されたデータを取得する必要があります。

+0

を確認できますが、ptrが指す値を変更できないのはなぜですか?私はconstとして宣言していないことを意味します。 – eRaisedToX

+0

@eRaisedToX 'char * ptr =" Hello ";'を宣言すると、それは読み出し専用メモリに格納され、それを変更することはできません。 – ameyCU

+0

はい@ameyCUは正しいです! – SKG

関連する問題