2016-11-06 10 views
2

ヒストグラムを印刷するために使用される2D配列を作成する必要があります。私は配列が52要素幅になることを知っていますが、配列の高さはmax + 1に等しくなります。配列は呼び出されるたびに異なっています。理想的には、行は以下の機能を達成するでしょう:Cでmalloc()を使用せずに変数を使用して配列を宣言するにはどうすればよいですか?

char histPlot[max+1][52] = ""; 

私は私のコードを書いていたように、しかし、私はC、または少なくとも私のコンパイラは、配列が一定値なしで宣言することはできませんことを学びました。このコードを記述しているクラスの教授は、この割り当てにmalloc()を使用できるかどうかについてはっきりしていませんでした。 malloc()を使用できないと仮定して、配列histPlot[][]を作成して、正確にmax + 1の高さにする方法はありますか?

編集:私はmalloc()または類似の機能を使用せずに自分がやろうとしていることを達成するための実際の方法がないことを認めました。私は、それらの関数や2D配列をまったく含まないソリューションを見つけることができましたが、回答した人にありがとう!

答えて

0

基本的に、可変長配列の場合、動的割り当てが必要です。これは、mallocまたは同様の機能の1つを意味します。

C99を使用する場合は、直接宣言できます。

+0

私は、これがC99であることをかなり確信しているが、それはまだ私はそれを直接宣言することはできないだろう。しかし、malloc()や2D配列の必要性を回避する、私の問題とは別の解決策を見つけました。ありがとうございました! – DCaruso

0

システムによっては、alloca機能があります。 (しかし、これは標準的なCではありません)

これ以外にも、動的サイズの配列を取得する実際の方法はありません。

私は次の多かれ少なかれ愚かな回避策を提供することができます:(あなたがmallocを使用することはできませんルールの手紙ではなく、精神以下)のメモリを割り当てる

  • 使用callocまたはrealloc
  • ...またはmmap
  • (あなたのプラットフォームがあることを持っている場合)、それは本当の配列である必要はありません場合は、(fseekfreadfwrite経由でのアクセスを)あなたのデータを格納するtemporary fileを使用
  • あなたの代わりに、リンクされたリストを使用することができれば、あなたは再帰関数によってスタック上のものの一つを構築することができますが、C99では
+0

母、私はあなたの最初の解決策でうまく笑ってしまった。私はより明確にすべきだった、私たちが使用できる唯一のライブラリはstdio.h math.hとctype.hです。幸いにも、私は、2Dアレイの必要性を回避し、まったく異なるソリューションを考え出しました。あなたのご協力ありがとうございました! – DCaruso

0

を呼び出して、あなたは実行時まで利用できない値を使用して、可変長配列を宣言することが許可されています。ただし、固定イニシャライザを使用することはできません。 for()文内int型を宣言する機能は、別のC99の拡張機能であることを

char histPlot[max+1][52]; 
for (int i=0; i<=max; i++) { 
    strcpy(histPlot[i], ""); 
} 

お知らせ:何それが意味することは代わりに

char histPlot[max+1][52] = ""; 

のあなたはこのような何かを書かなければならないだろうということです。このコードを正常にコンパイルするには、おそらく-std=c99のようなものをコマンドラインに追加する必要があります。

また、スタックよりもヒープに利用できる領域がはるかに多いことを指摘しておきます。大きな配列を宣言する必要がある場合(つまり、maxの値が数百を超える場合)、malloc()を使用してヒープ上に配列を作成することが理にかなっています。

+0

私の問題は、定数値を使用せずに配列を宣言することさえできないということでした。幸いにも、2Dアレイの必要性を完全に回避する、私の問題に対する別の解決策を発見しました。私はヒープとスタックについてのビットを知らなかったので、Cで新しいことを教えてくれてありがとう! – DCaruso

0

大きすぎない場合は、このようなスタックの関数で宣言できます。

#include <stdio.h> 
void a(int b,int c) { 
    char d[b][c]; 
    d[0][1] = 'a'; 
    printf("%c\n",d[0][1]); 
    return; 
} 
int main() { 
    a(8,14); 
    return 1; 
} 

出力:

関連する問題