2012-04-04 11 views
0

私はノブですので、これを短くします。以下の法律(C99)はありますか?私は一度に1つ以上の配列を格納する必要はありません。私は最大限必要な長さの配列を作り、その一部だけを使うことができましたが、私はむしろこれをやりたいと思います。配列を2回宣言する(C99)

int main(){ 
    double drm[15000]; 
    //do some stuff 
    double drm[14000]; 
    //do some other stuff 
} 

答えて

1

いいえ、できません。彼らは別のブロックに入る必要があります。あなたはすることができます:

int main(void) 
{ 
    { 
    double drm[15000]; 
    // do some stuff 
    } 
    { 
    double drm[14000]; 
    // do some other stuff 
    } 
} 

しかし、なぜ機能を呼び出すだけではありませんか?異なるブロックに置いても、コンパイラーがストレージに対して何を実行するのかは実際には保証されません。

+0

ありがとう!私は最小限の例では入れませんでしたが、これは実際にfor(blah = 0; blah user1313527

+0

はい - 新しいブロックは '{'があり、どこでも一致する '}'がどこかで始まります。 –

0

配列はC言語のポインタと強く関連しているため、動的配列も使用できます。まず、15,000要素の新しいdouble配列を割り当てます。あなたがもうそれを必要としないときは、それを削除してください。 14 000要素で新しい配列を作成します。

配列を使用した後にヒープを解放することを忘れないでください。人々はこれを忘れる傾向があります。さらに、割り当てが成功したかどうかを確認する必要があります。

int main(void) 
{ 
    double *drm = 0; 
    drm = (double*)malloc(15000 * sizeof(double)); 
    // do something 
    free(drm); 
    drm = (double*)malloc(14000 * sizeof(double)); 
    // do some other stuff 
    free(drm); // don't forget me 
} 

しかし、私はCarl Norumと同意します。代わりに関数を使用してください。

+0

投稿は 'C++ 'ではなく' C99'とタグ付けされています。 'malloc()'と 'free()'を使うようにあなたの例を更新してください。 – tomlogic

+0

C99に 'new'が追加されたのはいつですか? – KevinDTimm

+0

申し訳ありませんが、おそらく私はこれらの2つの言語を混ぜました。私は後でそれを修正します。 –

0

(あなたがデータを保持し気にしない場合やrealloc)あなたはmallocfreeを使用することができます。

#include <stdlib.h> 
int main(void) 
{ 
     double *drm = (double *)malloc(sizeof(double)*15000); 
     //do stuff 
     free(drm); 
     drm = (double *)malloc(sizeof(double)*14000); 
     //do other stuff 
     free(drm); 
} 
+1

malloc()の結果をキャストしないでください。 – KevinDTimm

+0

@KevinDTimmなぜですか?それには何も問題はありません。 –

+1

@JacobAbrahams:それには何も問題はありません。 'void *'型の式は、(関数型へのポインタ型以外の)ポインタ型に暗黙的に変換される可能性があります。キャストはちょうど混乱しており、状況に応じてエラーを隠すことができます。たとえば、C90では、 '#include '(*非* '*';これは非標準です)を忘れた場合、コンパイラは 'malloc'が' int'を返すと仮定します。結果を 'double *'にキャストすると不正なコードが生成される可能性があります。 –