2017-10-04 10 views
1

中の化合物リテラルへのポインタを初期化すると、ポインタを初期化するのそれほど一般的ではない方法である:ここここC

int *p = (int[10]){[1]=1}; 

、ポインタポイントは、複合リテラルです。

#include <stdio.h> 
int main(void) 
{ 
    int *p = (int[10]){[1]=1}; 
    printf("%d\n", p[1]); 
} 

出力:

1 

このプログラムはコンパイルされ、G ++コンパイラで正常に実行されます。

ので、

  • は、それが複合リテラルへのポインタを初期化する正しい方法は何ですか?または

  • 複合体リテラルへのポインタを初期化する動作は未定義ですか?

+0

'int p [10];'と 'p [1] = 1'を設定した後で(きれいにコーディングしたい場合) – YaatSuka

+0

"無名配列要素 "ではなく"コンパウンドリテラル "と呼ばれることがあります。そうでなければ質問しましょう:これまで何もポインタに変換せずにこのような複合リテラル*を使う方法はありますか?いいえ、唯一の疑問は複合リテラルの存続期間です。 –

+0

"ポインタを初期化する正しい方法ですか?"あなたがそれでやりたいことに依存します。コードは 'int arr [10] = {[1] = 1}と100%等価です。 int * p = arr; 'ローカルスコープの配列が必要な場合は、どちらも問題ありません。 – Lundin

答えて

2

はい、複合リテラルへのポインタを持つことは有効です。 Standardはこれを可能にします。

n1570-§6.5.2.5(P8):

例1ファイルスコープ定義

int *p = (int []){2, 4}; 

は最初、2つのintの配列の最初の要素を指すようにpを初期化します2番と2番、4番の値を持つ。この複合リテラルの式は定数である必要があります。 名前のないオブジェクト には、静的格納期間がです。

+0

この例はファイルスコープ用ですが、このイニシャライザは関数スコープ内にあるので、定数値を持つ必要はありません。 –

+0

@AnttiHaapala;合意したそれはC標準で言及されていることを実証するためのものです。 – haccks