2017-01-09 14 views
-3

私はそれに関する他の質問を読んだが、まだ何が起こっているのかを理解できなかった。NULLへのポインタを設定すると、「キャストのないポインタからの整数の割り当て」警告

char* func(const char* oldList) { 
    static char* newList = NULL; 

    if (oldList == NULL) { 
     *newList = NULL; 
    } 
    ... 
} 

私は取得しています警告が(ライン*newList = NULL用)「の割り当ては、キャストせずにポインタから整数を作る」です。どうして?

+2

を。それは 'char'です。 'newList = NULL;'が必要です。 –

+0

これはセグメンテーションフォールトを生成します。 –

+3

'newList'は' char * 'なので、' * newList'は 'char'です。 'NULL'はポインタであり、' char'へのポインタを代入すると警告が発生します。そして、いいえ、セグメンテーション違反は発生しません。あなたの現在のコードは。 – Downvoter

答えて

4

newListは、charへのポインタです。

*newListは、ポインタが指すチャーです。

だから文字にポインタ(NULL)を割り当てる*newList = NULL試行を割り当てる - 従ってキャスト。この特定のコードで

、あなたがキャストのいくつかの種類を行う場合でも、あなたはまだnewList = NULL以来、セグメンテーションフォールトを持っています。

おそらく、書くためのもの: `* newList`がポインタではありませんので

if (oldList == NULL) { 
    newList = NULL; 
} 
+3

AFAIK、 "キャスト"は '(int)NULL'のようなものです。私たちがここに持っているのは、暗黙の変換が定義されていないので、 'void *'( 'NULL'が定義されていると思います)から' char'への無効な変換*です。 – Downvoter

+2

@Downvoter:NULLはNULLポインタ定数です。さまざまな方法で定義できます。そのうちの1つは「0」である。時には、適切な接尾辞( '0ULL'など)が与えられ、正しい型(' uintptr_t'の基礎となる型)の整数になります。時には '((void *)0)'として与えられます。 'NULL'が' void * 'にキャストされないと、' char c = NULL; 'でそれを悪用し、' NULL'にキャストが含まれているプラ​​ットフォームでコンパイラの警告がなぜ起こるのか疑問です。 (Grrrr !!!! - そのような 'NULL'を悪用する人を対象にしています) –

+0

キャストとコンバージョンについて:キャストは_'(タイプ)' _キャスト演算子を使用して明示的に変換を強制する方法です。それがなければ、ケースバイケースで暗黙のうちに変換が行われる可能性があります。キャストを使用すると、指定したタイプのデフォルトの変換動作を上書きできます。投稿されたコードにキャストはなく、無効な変換のみです。無効なキャストは 'orange_t orange; ...(apple_t)オレンジ '型は構造体です。 – Lundin

関連する問題