2012-02-22 14 views
1

どのC関数にも、すでに宣言されたポインタはありますが、まだ値が割り当てられていないとしましょう。我々の例ではintとする。固定サイズの配列へのCの既存のポインタ

int *ptr; 

機能の目標は、ptrヒープ上の任意の動的メモリ、そういないmallocコールを割り当てることではありません。代わりに、固定サイズの配列nを指し示すようにします。私はそうのようにこれを実現することができ知っている:

int arr[n]; 
ptr = arr; 

我々は関数の中で、この何回も行う必要がある場合は、コードは非常に読み厄介とハード得ることができる、すなわち、多くのポインタフィールドの構造体すべての必要性固定長の配列を指す。これを1行で実現するためのより良い方法はありますか? (言わない

int *ptr; 
// Many other things happen in between... 
ptr[n]; 

*** EDIT ***
ここでは、以下の追加情報がいくつかのより多くの答えを導く助けるかもしれない:私は以下のようなものを考えて、それはあまりにも曖昧と互換性のないに見えました現在の回答はうまくいきません)。私の使用例では、ポインタは構造体で宣言されており、関数ではポインタを配列に代入しています。私は(すべてのポインタは、固定長の配列を指すように)以下のコードに比べてこれを達成する簡単な方法があるかどうかを知りたい:

struct foo { 
    int* a; 
    short* b; 
    char* c; 
    ... 
}; 

void func(void) { 
    struct foo f; 
    int n = ...; 
    int tempArr1[n]; 
    f.a = tempArr1; 
    short tempArr2[n]; 
    f.b = tempArr2; 
    char tempArr3[n]; 
    f.c = tempArr3; 
    ... 
} 
+0

これはあいまいではありません。実行時やコンパイル時にメモリが割り当てられていないと、メモリに障害が発生します。 – Hogan

+0

なぜ 'ptr'が必要ですか?単に 'arr'を直接使用するのはなぜですか? –

+0

@JamesMcLaughlin - 彼は見た目が好きではありません。 – Hogan

答えて

1

配列を宣言して単一の宣言で既存のポインタに割り当てることはできません。しかし、あなたはこのように、新しく宣言ポインタに配列ポインタを割り当てることができます。

#define DECL_ASSIGN_INT_ARRAY(name,size,pointer) int name[(size)]; pointer = name; 

あなたは、単一のライン内に留まることを主張した場合
int arr[n], *ptr = arr; 

、あなたはこのように、醜いマクロを使用することができます

このワンライナーの透明度は、投稿の2行バージョンの透明度よりはるかに低いので、私はあなたの初期バージョンを維持します。

EDIT別のオプションは、このように、宣言で使用されていないポインタ変数を作成し、初期化子であなたのポインタを割り当てることです

(質問の編集に応答して):

void func(void) { 
    struct foo f; 
    int n = ...; 
    int tempArr1[n], *tempPtr1 = f.a = tempArr1; 
    short tempArr2[n], *tempPtr2 = f.b = tempArr2; 
    char tempArr3[n], *tempPtr3 = f.c = tempArr3; 
    ... 
} 
0

これはあなたが必要としているクリアケースのように思えますいくつかのリファクタリング。同様のステートメント、extract them into a new function(構造体フィールドへの参照を渡し、構造体フィールドが指すようにする)を取って、この新しい関数に意味のある名前を付けます。

これはおそらく、数週間または数ヶ月で忘れることになるファンシーポインタの算術ショートカットよりもメンテナンスが容易で読みやすいでしょう。

0

ptrarrの違いは、ptrの値を変更できることです。だから私はptrを配列に移動したいと思う。

それでは、どのようにこのことについて:

int arr[n], id=0; 

そして、あなたはidの値を変更し、ptrとしてarr+idを使用しています。

0

私はこれを行う方法は、マクロを使用することだと思います。これは、私はそれが「醜い」かもしれませんが、マクロなしで保守が容易になると思い役立っている理由(未テスト)

#define autoptr(name,size) int Arrayname[size]; name = Arrayname; 

ような何かが、私は明確ではありませんよ。一般に、あなたが実際に行っていることを隠すことは悪いことです。

関連する問題