• ベストアンサー

構造体の動的確保について

ある変数により動的確保を行いたいのですが、構造体中の変数に対して動的確保はできるのでしょうか? struct data{ int i[30]; /*←ここの配列を動的に確保したい*/ double d[40]; /*←ここの配列を動的に確保したい*/ }data1[10]; よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.6

> data構造体の方も動的に確保したいと考えております。 ならば data に対しても vector を使います。 #include <vector> struct data { std::vector<int> i; std::vector<double> d; data(int ni=10, int nd=10) : i(ni), d(nd) {} }; int main() { std::vector<data> data1(10); // data[0]..data1[9] .... return 0; }

Nickee
質問者

お礼

回答ありがとうございます。ちゃんと実行確認をしてから、お礼の内容を書けばよかったのですが、一時の間、行うことができなくなってしまいました。一応ここで締め切らせてもらって、後ほど実行してみようと思います。 本当にありがとうございました。

その他の回答 (5)

noname#6581
noname#6581
回答No.5

data構造体の動的確保も同じです。ポインタにします。 struct data{  int *i;  double *d; } *data1; data1 = calloc(10, sizeof(struct data)); if (data1 == NULL) {  エラー処理 } data1[0].i = calloc(30, sizeof(int)); if (data1[0].i == NULL) {  エラー処理 } data1[0].d = calloc(40, sizeof(double)); if (data1[0].d == NULL) {  エラー処理 } data1[0].i[0] = 1; data1[0].d[0] = 1.1;

Nickee
質問者

お礼

回答ありがとうございます。

回答No.4

# ANo.#3 を受けて... C++なら可変長の配列がライブラリに用意されています。 struct data { std::vector<int> i; std::vector<double> d; data(int ni, int nd) : i(ni), d(nd) {} };

Nickee
質問者

お礼

回答ありがとうございます。vectorの存在は知っていたのですが、No.1~No.3さんまでの御礼の内容にありますように、data構造体の方も動的に確保したいと考えております。 また、名前空間の使い方(私のパソコンでstdが認識できない)と、この行の内容がわからないので、勉強してみます。 data(int ni, int nd) : i(ni), d(nd) {}

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.3

ちょっと、質問の意図からずれるかもしれませんが c++ に手を出してみてはどうでしょう? struct data {  int *i;  double *d;  data();  ~data(); }; data::data() {  i = new int[確保したい個数(その1)];  d = new double[確保したい個数(その2)]; } data::~data() {  delete [] i;  delete [] d; } { /* 使うとき */  data* data1 = new data[10];  ~ } ま、確保したい個数をどう渡すか、ってことは別に考えなくちゃいけないんですが。 C の範囲だと、#2 のような感じで、いちいち malloc() するしかないんです。 {  struct data {   int *i;   double *d;  } data1[10];  int i;  for (i = 0 ; i < 10 ; ++i) {   data1[i].i = malloc(sizeof(int) * 確保したい個数(その1));   data1[i].d = malloc(sizeof(double) * 確保したい個数(その2));  } } と、いった感じで。 # エラー処理も入れてなければ、動作確認もしてません

Nickee
質問者

お礼

回答ありがとうございます。C++は最近になって勉強し始めたのでなれていませんが、少しずつプログラムに取り入れていこうとおもっています。もし、dataの構造体も動的に確保したい場合はどうすればよいか教えてもらえないでしょうか?よろしくお願いします。

noname#3227
noname#3227
回答No.2

素人です 記述のしかたが古いのですけど、いちおう Borland C++ 5.5.1 で コンパイルと実行して見ました、問題ないみたいです。 #include <stdio.h> #include <stdlib.h> struct data{ int *i; /*←ここの配列を動的に確保したい*/ double *d; /*←ここの配列を動的に確保したい*/ }data1; void main() { int i; int count0,count1; count0=100; count1=200; if ((data1.i=(int *)malloc(sizeof(int)*count0))==NULL) { printf("メモリが確保できませんでした\n"); exit( EXIT_FAILURE ); } for(i=0;i<100;i++) {*(data1.i+i)=0;} if ((data1.d=(double *)malloc(sizeof(double)*count1))==NULL) { printf("メモリが確保できませんでした\n"); exit( EXIT_FAILURE ); } for(i=0;i<100;i++) {*(data1.i+i)=0;} for(i=0;i<100;i++) {data1.i[i]=i;} for(i=0;i<200;i++) {data1.d[i]=i;} for(i=0;i<100;i++) {printf("%d: %d\n",i,data1.i[i]);} for(i=0;i<200;i++) {printf("%d: %e\n",i,data1.d[i]);} } 見当はずれでなかったら嬉しいです。

Nickee
質問者

お礼

回答ありがとうございます。

noname#6581
noname#6581
回答No.1

このような場合は、ポインタにします。 struct data{  int *i;  double *d; }data1[10]; data1[0].i = calloc(30, sizeof(int)); data1[0].d = calloc(40, sizeof(double));

Nickee
質問者

お礼

回答ありがとうございます。 data1の方が固定した状態ではよくわかりましたが、data構造も動的に確保するためいのですが。。。。VC++で出来る範囲で。よろしくお願いします。