2016-11-03 21 views
-4

コードは動作する必要があるため、動作します。Cポインタの違いChar Int

void TstPointer(int *Pointer) 
    { 
     *Pointer = 3; 
    } 

    int main() 
    { 
     int number = 1; 
     int *ptr = &number; 

     TstPointer(ptr); 

     printf("%d\n", number); 
    } 

私がchar型に切り替えると、それは動作しません。

void TstPointer(char *Pointer) 
{ 
    *Pointer = "Hell1"; 
} 

int main() 
{ 
    char *Hello = "Hello"; 
    TstPointer(Hello); 
    printf("%s\n", Hello); 
} 

警告:割り当てキャストせずにポインタの整数を作る[-Wint変換] *ポインタ= "Hell1"。

+0

、 ' "Hell1が"'であるH''が文字( 'char')です ''文字列( 'char'の配列) – BeyelerStudios

+1

初心者レベルのCプログラミングブックでポインタと文字列がどのように機能するかを調べてください。 – Lundin

答えて

0

*Pointer = "Hell1";コンパイラがあなたに警告している間に警告しました。おそらくundefined behaviorを呼び出すものを無視することにしました。あなたが変更することが許可されていないリテラル文字列にPointerポイントとして、問題の原因となるポインタにコピーするには、一般的に

strcpy()を使用しますが、その場合には、。

をそのメモリの場所に書き込む前に、メモリが書き込み可能であることを確認する必要があります。メモリアロケータ関数を使用するか、配列を作成し、ポインタを配列の先頭に移動させます。

0

TstPointerメソッドでは、*Pointer = "Hell1";を実行すると、警告が生成されます。

これは、Pointerがcharポインタである場合、*Pointerがchar変数であるためです。そして、間違っているchar変数に文字列定数を代入しています。

この問題を解決するには、mainにある(ポインタの)アドレスを渡すときに、関数のパラメータにダブルポインタを使用する必要があります。

EDIT:あなたは変数に文字列定数(char型のポインタや配列、通常は)、文字列定数の先頭の変数アドレスを記憶することを割り当てるときので

あなたは警告を取得しています。現在、lvalueがcha​​rポインタ型ではなくchar変数である場合、通常のchar変数に "address"を代入(適合)するための暗黙の変換が行われ、警告が返されます。しかし、我々はcharがメモリアドレスを受け入れることができないことを知っているので、通常は印刷時にsegfaultになります!

+0

またはstrcpy(Pointer、 "Hell1"); – Turtle

+0

@skrtbhtngr expected 'char **'しかし、引数は 'char *'型です void TstPointer(char ** Pointer) –

+0

メインでは、 'TstPointer(&Hello);'です。 – skrtbhtngr

0

あなたはint型と同じようにあなたの方法をHelloの参照(&Hello)を渡し -

int *ptr = &number; TstPointer(ptr);

+0

'void TstPointer(char ** Pointer) { \t * Pointer =" Hello "; \t } int main() { \t char * Hello = "Hello World"; \t TstPointer(&Hello); \t printf( "%s \ n"、こんにちは); } 'だから私はあなたの答えに基づいてそれを解決しました。 –

関連する問題