• ベストアンサー

初期化関数でmallocしたい

main関数でポインタや構造体などを宣言し、 それをそれぞれ初期化関数を使ってmallocしたいのですが、 どうしてもエラーが出てしまいます。 例えばこのような感じです。 //呼び出し元 long *t; t = Init_t(n, t); //初期化関数 t = (long*)malloc(sizeof(long) * n); ・・・ return t; とやると、t = Init_t(cpm.n, t); のところで variable "t" is used before its value is set とエラーが出ます。 エラーが出る理由も分かるのですが、 どのようにエラーが出ない初期化関数を書けばよいのか分かりません。 あまりmalloc等を使うプログラムを書いたことがなかったので、 様式美のようなものも分かりません。 お願いします。

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

  • ベストアンサー
  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.2

Init_t()のプロトタイプも書きましょう。 どうやらlong *Init_t(int n, long *t)のようですが、第二引数は不要というか無意味ですね。 long *Init_t(int n)で十分でしょう。 あくまでtを渡すならvoid Init_t(int n, long **t)辺りで。

aoiro000
質問者

お礼

解決しました! ありがとうございました。

その他の回答 (1)

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

//呼び出し元 long *t; t = Init_t(n); //初期化関数 long *u = (long*)malloc(sizeof(long) * n); ・・・ return u; ということかい?

aoiro000
質問者

お礼

解決しました! ありがとうございました。

関連するQ&A

  • malloc関数によるメモリの確保

    C初心者です。 malloc関数によるメモリの確保に関して教えてください。 2次元配列のサイズに対してmalloc関数の引数値をたとえば、 (double*)malloc(datasize*sizeof(double)) などとしメモリ領域を確保すると、メモリアドレスはデータのサイズ によらず一定 1234044、1234048となります。 データサイズを大きくし、datasize*sizeof(double)が16Kバイトを超えるとcmd.exeがエラーとなり落ちます。 デバックモードで実行すると 「"System.AccessViolationException"のハンドルされていない例外が不明なモジュールです。で発生しました。 追加情報:保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリがこわれていることが考えられます」 というメッセージがでます。 コンパイラはExpressEdition2008です。 この現象を回避するにはどうすべきか、なぜこのようなことが起こるのかご教授ください。 よろしくお願いいたします。

  • mallocで動的確保後、値が変わる

    最近よく出くわすバグなのですが、mallocでメモリを動的確保して、いくつかの処理をした後に値が変わっていたり、読めなくてセグメンテーションエラーになることがあります。 根本的に何か間違っているのかもしれませんが、なかなかわかりません。 例えばこんな感じです ... int main(int argv,char *argc[]) { double *arrXn; double *arrFn; double *arrX; double *arrY; double *arrV; double *arrD; double **arrCn; ... //N(0~9)を受け取る arrXn=(double *)malloc(sizeof(double)*(N+1)); arrFn=(double *)malloc(sizeof(double)*(N+1)); arrX=(double *)malloc(sizeof(double)*(N+1)); arrY=(double *)malloc(sizeof(double)*(N+1)); arrV=(double *)malloc(sizeof(double)*(N+1)); arrD=(double *)malloc(sizeof(double)*(N+1)); arrCn=(double **)malloc(sizeof(double *)*(N+2)); for(incA=0;incA<=N;incA++){ arrCn[incA]=(double *)malloc(sizeof(double)*4); } for(incA=1;incA<N;incA++){ arrCn[incA][0]=arrFn[incA-1]; arrCn[incA][1]=arrV[incA-1]; arrCn[incA][2]=-3*arrFn[incA-1]+3*arrFn[incA]-2*arrV[incA-1]-arrV[incA]; arrCn[incA][3]=2+arrFn[incA-1]-2*arrFn[incA]+arrV[incA-1]+arrV[incA]; } printf("%lf",arrCn[1][1]);getchar(); //取れる for(incA=0;incA<=numHokan;incA++){ arrX[incA]=Setx(incA); //自作関数 } printf("%lf",arrCn[1][1]);getchar(); //セグメンテーションエラー 特に多次元配列を作成したり、動的確保を大目にすると起こりやすいです。 もし何かお気付きのことがありましたらよろしくお願いします。

  • malloc関数の使い方について(初心者)

    膨大なデータ数を扱うためにmalloc関数を用いて配列にデータを格納し、それを表示するプログラムを考えました。コンパイルはできるのですが、実行するとエラーが起こります。freeの開放の仕方が間違っているのでしょうか?よろしくお願いします。 /*ソース*/ #include <stdio.h> #include <stdlib.h> #define N 130000 int main(void) { double *p; int i; p = malloc(N); if(!p){ printf("割り当てエラー"); exit(1); } for(i=0;i<N;i++){ p[i]=i; printf("%f\n",p[i]); } free(p); }

  • 2つのvoid関数でmallocを使うと2step目でセグメントエラーが出る

    プログラムのmainを見やすくするためにサブルーチンとしてvoid関数を使っているのですが、その中でmallocでメモリを確保して配列を作ろうとするとエラーが出てしまいます。概略を書くと #include <stdio.h> #include <math.h> #include <stdlib.h> //voidの宣言 void a(double* ,double*, double,); void b(double* ,double*, double,); main(){ double *c,*d,e; double *f,*g,h; c=(double *)malloc(sizeof(double)*N) //Nは適当な整数です d,f,gも同様の処理 色々な作業 while(適当回数繰り返します){ a(c,d,e); b(f,g,h); 色々な作業 } } void a (double* c, double* d, double e){ double **i,*j,; int k; i=(double **)malloc(sizeof(double *)*M) //Mは適当な整数です for(k=0;k<=M;k++){ i[k]=(double *)malloc(sizeof(double)*M) //Mは適当な整数です } jも同様にメモリ確保 様々な作業(逆行列の計算など) } void bはaとほとんど同じです。 mallocで二次元配列や配列を作っています。勿論同じ文字は使っていません。 以上のようなプログラムでgccは通ります。でも実行するとwhile内での1step目は上手くいくのですが、2step目のb内での始めの(double *)malloc(sizeof(double)*L)(Lは適当な整数です)で、つまりメモリ確保でセグメントエラーが出ます。両者とも片方を削るとエラーは出ません。1step目は何故上手くいくのか、2ステップ目で何故ダメなのかが分かりません。皆様の御教授をお願いします。

  • malloc関数の使い方

    このじゃんけんプログラムに、ゲーム終了時ユーザーとコンピュータが出した全ての手を履歴として表示したいのですがmalloc()関数を使って表示させるとしたらどういったプログラムになりますか。 *aと*b、int stage=0を最初に宣言して void rireki(void) { a = (int *)malloc(sizeof(int) * (draw_no+lose_no+win_no)); a[stage++] = comp; b = (int *)malloc(sizeof(int) * (draw_no+lose_no+win_no)); b[stage++] = user; } 関数を作り、最後にprintf文で書いたのですがうまくいきませんでした。 hd[a[i]]という風に配列に配列を入れたのが駄目だったかもしれません。 for(i=0; i<draw_no+lose_no+win_no; i++){ printf("%d回目 ユーザ:%c コンピュータ:%c\n", i+1, hd[b[i]], hd[a[i]]); } また本の課題なのですが、malloc関数は後に出てくるのでmalloc関数を使わずに履歴表示できるかもしれないのですが その場合配列をあらかじめ宣言して格納する手段になるのでしょうか。 よろしくお願いします。 /* 課題3-6 */ #include <time.h> #include <stdio.h> #include <stdlib.h> int user; /* プレーヤの手 */ int comp; /* コンピュータの手 */ int win_no; /* 勝った回数 */ int lose_no; /* 負けた回数 */ int draw_no; /* 引き分けた回数 */ char *hd[] = {"グー", "チョキ", "パー"}; /* 手 */ /* initialize関数の宣言 */ void initialize(void); /* jyanken関数の宣言 */ void jyanken(void); /* count_no関数の宣言 */ void count_no(int result); /* disp_result関数の宣言 */ void disp_result(int result); /* confirm_retry関数の宣言 */ int confirm_retry(void); /* メイン関数 */ int main(void) { int judge; /* 勝敗 */ int retry; /* もう一度 */ initialize(); /* 初期処理 */ do{ jyanken(); /* じゃんけん実行 */ /* コンピュータとプレーヤの手を表示 */ printf("私は%sで、あなたは%sです。\n", hd[comp], hd[user]); judge = (user - comp + 3) % 3; /* 勝敗を判定 */ count_no(judge); /* 勝/負/引分け回数を更新 */ disp_result(judge); /* 判定結果を表示 */ retry = confirm_retry(); }while(retry == 1); printf("%d勝%d敗%d分けでした。\n", win_no, lose_no, draw_no); return (0); } /*--- 初期処理 ---*/ /* initialize関数の定義 */ void initialize(void) { win_no = 0; /* 勝った回数 */ lose_no = 0; /* 負けた回数 */ draw_no = 0; /* 引き分けた回数 */ srand(time(NULL)); /* 乱数の種を初期化 */ printf("じゃんけんゲーム開始!!\n"); } /*--- じゃんけん実行(手の読み込み/生成) ---*/ /* jyanken関数の定義 */ void jyanken(void) { int i; comp = rand() % 3; /* コンピュータの手 (0~2) を乱数で生成 */ printf("\n\aじゃんけんポン …"); for(i=0; i<3; i++) printf(" (%d)%s", i, hd[i]); printf(":"); scanf("%d", &user); /* プレーヤの手を読み込む */ } /*--- 勝/負/引き分回数を更新 ---*/ /* count_no関数の定義 */ void count_no(int result) { switch(result){ case 0: draw_no++; break; case 1: lose_no++; break; case 2: win_no++; break; } } /*--- 判定結果を表示 ---*/ /* disp_result関数の定義 */ void disp_result(int result) { switch(result){ case 0: puts("引き分けです。"); break; /* 引き分け */ case 1: puts("あなたの負けです。"); break; /* 負け */ case 2: puts("あなたの勝ちです。"); break; /* 勝ち */ } } /*--- 再挑戦するか確認 ---*/ /* confirm_result関数の定義 */ int confirm_retry(void) { int x; printf("もう一度しますか … (0)いいえ (1)はい:"); scanf("%d", &x); return (x); }

  • c言語のmalloc()とエラー表示

    .malloc()については以前も質問させて頂きましたが 新たな疑問についてご教示下さい。 ・下記のプログラムでmalloc()とrealloc()は正常に作動していると思いますが、入力表示を有効にすると下記の「エラー表示」が表示されます。 ・「エラー表示」されてもプログラムは最後まで実行される様です。 ・n=400までは表示されます。 ・この理由が分かりません、ご教示下さい。 ・malloc()関係は不安定な関数群でしょうか? ■「エラー表示」について *********************************************************** 問題が発生したため、***.exeを終了します。ご不便をおかけて申し訳ありません。 作業途中・・・・・ この問題を「マイクロソフト」に報告ください。 ************************************************************ ・一部ですが以上の様なエラー表示です。 //malloc_2 #include <stdio.h> #include <stdlib.h> void MylnOut(int ,int ,int *); //************************************************************** // MAIN //************************************************************** int main() { int *map; int X=10,Y=10,n; /* 疑似2次元配列確保と初期表示 */   printf("初期値.... \n");   map=(int *)malloc(sizeof(X*Y)); // MylnOut( X, Y, map); /* 変更数値入力 */ for(n=1;n<401;n++){   X=rand()%50+2;   Y=rand()%50+2;   printf("変更..%3d回目 X=%2d Y=%2d\n",n,X,Y); /* 領域変更と表示 */   map=(int *)realloc(map,sizeof(X*Y)); // MylnOut( X, Y, map); } /* 領域開放 */   free(map);   map=NULL; return 0; //************************************************************** // 入力・表示 //************************************************************** void MylnOut(int X,int Y,int *map) {   int i,j;   for(j=0;j<Y;j++)    for(i=0;i<X;i++) map[j*Y+i]=X;   for(j=0;j<Y;j++){    for(i=0;i<X;i++) printf("%3d",map[j*Y+i]);    printf("\n");   } } ・コンパイルエラーは無く実行時エラーです。 .Borland C++ Compiler 5.5.1,TuboDebugger 5.5を使用しています。

  • 構造体のメンバーのメモリ確保

    以下のようなイメージのコードでエラーは発生します。 どうしてでしょうか? よろしくお願いします。 typedef struct list{ wchar_t* Item; }; list* lst = (list*)malloc(sizeof(list)); lst->Item = (wchar_t*)malloc( sizeof(wchar_t) + sizeof(wchar_t) ); lst->Item = L"1\0"; free(lst->Item);//ここでエラー発生 free(lst);

  • c言語のmalloc関数と2次元配列について

    ・mallocとreallocのAPPを作成しています、下記は単純化しました。 「質問-1」 ・while(1){...以下を無効にした場合、正常に終了します。 ・有効にして、最初に999を入力した場合、エラー表示されます。 ・この理由が分かりません。 「質問-2」 ・有効にして、初期数値(例えば11)を入力の場合、正常表示されます ・続けて数値(例えば15)を入力した場合、エラー表示されます。 ・この理由が分かりません。 ***************************************************************  #include <stdio.h>  #include <stdlib.h>  void MylnOut(void);  int **map;  int X=10,Y=10,i,j; //************************************************************** // MAIN //************************************************************** int main() {  char str[64]={""};  char *s="変更数値を入力(999で終了).... "; /* 2次元配列確保と初期表示 */  map=(int **)malloc(sizeof(int *)*X);  for(i=0;i<X;i++)   map[i]=(int *)malloc(sizeof(int)*Y);  MylnOut(); /* 変更数値入力 */ // while(1){ //  printf(s); //  gets(str); //  X=atoi(str); //  if(X==999) break; /* 領域変更と表示 */ //  map=(int **)realloc(map,sizeof(int *)*X); //  for(i=0;i<X;i++) //   map[i]=(int *)realloc(map[i],sizeof(Y)); //  MylnOut(); // } /* 領域開放 */   for(i=0;i<X;i++) free(map[i]);   free(map);   return 0; } //************************************************************** // 入力・表示 //************************************************************** void MylnOut(void) {  for(j=0;j<Y;j++)   for(i=0;i<X;i++) map[i][j]=55;   for(j=0;j<Y;j++){    for(i=0;i<X;i++) printf("%3d",map[i][j]);    printf("\n");   } }

  • 関数内での多次元配列のメモリの動的確保について

    関数内で、参照渡しをして配列の動的なメモリの確保をしようとしているのですが、うまくいきません。 はじめに、main関数内で、 int main(void){ double *testdata1; testdata1 = (double*)malloc( sizeof(double) * 10 ); if( testdata1 == NULL ){ printf( "ERROR:testdata1" ); exit(0); } testdata1[3] = 20.4; printf( "test = %g\n", testdata1[3] ); } を実行したところうまくいきました。 そこで、 int main(void){ double *testdata1; Kakuho( &testdata1 ); printf( "test = %g\n", testdata1[3] ); } void Kakuho( double **testdata2 ){ *testdata2 = (double*)malloc( sizeof(double) * 10 ); if( *testdata2 == NULL ){ printf( "ERROR:testdata2" ); exit(0); } *testdata2[3] = 20.4; } としましたが、成功してくれません。 コンパイルは通りますが実行するとエラーが発生して落ちます。 (上記のprintfのERRORではありません。) 動作環境はXPのVCC7です。よろしくお願いします。

  • mallocの動作について

    RadixSort(基数ソート)で名簿のソートを行うプログラムを書いています。 Queueの挿入操作をする関数enqueueで処理が滞ってしまいます。 コンパイルは通りますが、どうやら「ココ→」(2箇所に書いておきました)で示した行が原因で止まってしまうらしいです。 対処方法が分からずに行き詰っています。どなたかご存知の方、教えていただけると嬉しいです。 ソースの前に、簡単ながらアルゴリズムを記しておきます。 1.名簿のテキストファイルを読み込む。 2.各人の名前は左詰で書かれている。 3.名前の右側にアルファベット順で'A'よりも先にくる文字'_'を詰める。 4.名前に使われる文字の種類だけキューを用意する。 5.名前の一番右側の文字を参照し、その文字に対応するキューに名前を入れる。 6.各キューに「落とし蓋」に相当する文字列を入れる。 7.最初のキューから順番にキューの後ろから名前を取り出し、名前の右から2番目の文字に対応するキューに名前を入れる。 8.取り出した名前が「落し蓋」であった場合は、次の番号のキューから名前を取り出すようにする。 9.全てのキューから全ての名前を取り出し、キューに入れなおす作業が終わったら、各キューに再び「落し蓋」をする。 10.以下、7~9の作業を、参照する文字の位置を1つずつずらしながら行う。 11.テキストファイルにソート結果を出力。 #include <stdio.h> #include <string.h> #include <stdlib.h> #define N 80 #define FS '_' //名前の右に詰める文字 typedef struct cell{  struct cell *next;  struct cell *prev;  char ch[N]; }cell; typedef struct queue{  struct cell *init;  struct cell *final; }queue; void enqueue(queue *q, char *x); int dequeue(queue *q, char *x); int main(int argc, char *argv[]){  FILE *fp_from, *fp_to;  char temp[N], endline[N];  int i, j;  queue *q[54]; //0:空白用の文字, 1~52:アルファベット, 53:スペース  for(i = 0; i < 54; i++){   q[i] = (queue *)malloc(sizeof(queue));   q[i]->init = NULL;   q[i]->final = NULL;  }  if(!argc){   printf("Please input a name of a listfile.\n");   return(1);  }  if(argc >= 3){   printf("You can input only two filenames.\n");   return(1);  }  if((fp_from = fopen(argv[0], "r")) == NULL){   printf("Reading error.\n");   return(1);  }  while(feof(fp_from) == 0){   fgets(temp, N, fp_from);   for(i = strlen(temp)-1; i < N; i++) temp[i] = FS; //空白用文字を名前の右側に詰める   enqueue(q[0], temp);  }  for(i = 0; i < N; i++) endline[i] = FS; //各キューの「落とし蓋」を用意  for(i = N-1; i > 0; i--){   for(j = 0; j < 54; j++){ ココ→ enqueue(q[j], endline);  //各キューに「落し蓋」を挿入する   }   for(j = 0; j < 54; j++){    while(1){     dequeue(q[j], temp);     if(temp[0] == FS) break;     if(temp[i] == FS){      enqueue(q[0], temp);     }else if((temp[i] >= 'A') && (temp[i] <= 'Z')){      enqueue(q[temp[i]-'A'+1], temp);     }else if((temp[i] >= 'a') && (temp[i] <= 'z')){      enqueue(q[temp[i]-'a'+27], temp);     }else if(temp[i] == ' '){      enqueue(q[53], temp);     }else{      printf("There was an unavailable symbol.\n");      return(1);     }     free(temp);    }   }  }  if(argc == 1) fp_to = fopen(strcat(argv[0], "_2.txt"), "w");  else fp_to = fopen(argv[1], "w");  for(i = 0; i < 54; i++){   while(1){    if(dequeue(q[i], temp) == 1) break;     fputs(temp, fp_to);      fputc('\n', fp_to);   }  }  fclose(fp_from);  fclose(fp_to);  return(0); } //キューqに1つの要素xを前から入れる。 void enqueue(queue *q, char *x){  cell *r; ココ→ r = (cell *)malloc(sizeof(cell));  strcpy(r->ch, x);  if(!q->init) q->final = r;  r->prev = NULL;  r->next = q->init;  if(q->init) q->init->prev = r;  q->init = r;  return; }