2010-11-27 6 views
12

Cで、私はこのアレイのすべての値を(初期化した後で)1行で設定できますか?

int myarray[5] = {a,b,c,d,e}; 

ような配列は、しかし、配列がすでに

int myarray[5]; 

のように初期化し、その後、その後いくつかの点で、私は/変更を設定したいと想像することができます知っています

myarray[0] = a; 
myarray[1] = b; 
myarray[2] = c; 
myarray[3] = d; 
myarray[4] = e; 

のではなく、より多くの

のような何かをすることなく、すべての値
myarray = {a,b,c,d,e}; 

私は、ヒープ上で私の配列を宣言した場合、私は次のように配列を初期化しますので、私はこれを尋ねる理由は次のとおりです。そして、私はすべての値に入力できるようにしたいと思い

int* myarray = malloc(5*sizeof(int)); 

1行(主に自分のコードをよりきれいにするため)

答えて

11
memcpy(myarray, (int [5]){a,b,c,d,e}, 5*sizeof(int)); 
+1

これはC99専用ではありませんか? –

+3

はい。しかし、誰かがテンプレートを使ってC++の答えを与えると、C++ 98が必要なコメントが必要ですか?また、Cで関数プロトタイプを使用する場合、ANSI Cより前の実装では機能しないことに言及する必要がありますか? C99 **は**現在のC言語です。 –

+3

@R:残念ながら、多くの人がC89についています。マイクロソフトはまだVisual StudioでC99をサポートしていないため、多くの学生はTurbo Cなどの古いコンパイラを使用する必要があります。したがって、大多数のユーザーがC99固有の機能を使用できると仮定することはおそらく正当ではありません。 –

1

いいえ、Cにはこのような機能はありません。すべての配列要素を同じ値に設定する場合は、memset(3)を使用します。ここで

+5

この答えは誤解を招くことができます。 'memset'は"配列要素 "を値に割り当てません。メモリブロック内の* bytes *を特定の値に割り当てます。 2番目の引数は 'char'と解釈されます。たとえば、 'memset'を使って' int [] 'の要素を' 10'に初期化することはできません。 –

+0

@Mehrdad、はい、そうです。 –

+1

しかし、これを使って 'uint {8,16,32,64} _t'の配列を' UINT {8,16,32,64} _MAX'に初期化することができます。 :-) –

4

は、それはあなたが唯一の場所にデータを入力心配利点を持っている互換性のあるすべての規格(C89、C99、C++)

あるソリューションです。他のコードは変更する必要はありません。マジックナンバーはありません。配列はヒープ上で宣言されます。データテーブルはconstと宣言されています。

(Click here to try running it in Codepad)

#include<stdio.h> 
#include<stdlib.h> 

int main() 
{ 
unsigned int i = 0; 
int *myarray = 0; 
static const int MYDATA[] = {11, 22, 33, 44, 55}; 

    myarray = (int*)malloc(sizeof(MYDATA)); 
    memcpy(myarray, MYDATA, sizeof(MYDATA)); 

    for(i = 0; i < sizeof(MYDATA)/sizeof(*MYDATA); ++i) 
    { 
    printf("%i\n", myarray[i]); 
    } 

    free(myarray); 

    return 0; 
} 
+0

'MYDATA'は' static'と宣言することもできます。 – caf

+0

私はこれを投票しますが、あなたが 'MYDATA'を' static'に変更した場合に限ります。そうしないと、ほとんどのコンパイラが非常に悪いコードを生成します。 –

+0

MYDATAはconstと宣言されているため、.textまたは.const .dataになりません。それは関数内でデカルトされるので、リンケージは内部的です。したがって、スタティックは必須でも有益でもありません。まあ私の経験では多分cafとRにはコンパイラがあり、問題を解決するために編集します。 – T33C

0
#include<stdio.h> 
#include<stdlib.h> 

int *setarray(int *ar,char *str) 
{ 
    int offset,n,i=0; 
    while (sscanf(str, " %d%n", &n, &offset)==1) 
    { 
     ar[i]=n; 
     str+=offset; 
     i+=1; 
    } 
    return ar; 
} 

int main() 
{ 
    int *sz=malloc(5*sizeof(int)),i; 

    //call 
    setarray(sz,"10 30"); 

    //output 
    for(i=0;i<2;i++) 
     printf("%d\n",sz[i]); 

    return 0; 
} 
関連する問題