• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:realloc の使い方について教えてください!)

realloc の使い方について教えてください!

D-Matsuの回答

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

c++やるのにSTLを知らないってのは、基本やり直してこいレベルですけど。 標準c++に入っているものですし、特に追加するものなしに利用できます。

psychang
質問者

補足

ご回答ありがとうございます。 確かに参考書をたんまり買ったくせして、困ったときしか、みません。(反省) 「猫でも分かるシリーズ」は読みましたが・・・。 私の場合、回りに聞ける人がいたり、仮にプログラマになって経験をつまないと、学習速度が遅いと思いますυ もうちょっと締め切るのは後にします。STLを教えてくれて感謝です!!

関連するQ&A

  • realloc

    reallocの使いかたに関してです。 #include <stdio.h> #include <stdlib.h> main () { int narray[5]; int *pn, *pn2; pn=narray; printf("%p <=> ",pn); printf("%p\n",narray); memset(pn,0,sizeof(int)*5); if((pn2 = (int *)realloc(pn, sizeof(narray)*2))==NULL){ printf("error"); exit(0); } pn=pn2; memset(pn,0,sizeof(int)*5*2); printf("realloc!\n"); return(0); } この記述はどこかまちがっているでしょうか? 最初の配列のサイズを2倍に増やすというだけのぷろぐらむなのですが。 どうもreallocの場所でセグメンテーションフォルトになります。

  • reallocとstrtokの併用について

    fscanfで文字列を読み込み、strtokでカンマ区切りにするという関数を作りたいのですが、 reallocすると先頭から徐々にデータが文字化けしていきます。 まず最初に4つ分のchar*を取ります。 もし、5つ目が見つかったらさらに4つ増やし、9つ目が見つかったらさらに。。。というようになっております。 n個目の判定はcntがn-1で真になり、reallocが成功したら個数を増やすようになってます。 5つ目が見つかった時点では出力に問題は無いのですが、6個目から侵食が始まっていきます。 原因がどうしても自分では分からなかったので、誰かお願い致します。 words.txtの内容(末尾改行なし) iii,jjj,kkkkkkkkk,l,m,n,ooooo,pppppppp,a,s,d,f,g main.c #include<stdio.h> #include<stdlib.h> #include<string.h> #include"C:\borland\bcc55\Include\malloc.h" int readlinefile(FILE *fp,char **words){ int cnt=0,len; char *line=(char *)malloc(256); char *tmp; if(line==NULL) return 0; if(fscanf(fp,"%s",line)!=EOF){ if((tmp=(char *)realloc(line,sizeof(char)*(strlen(line)+1)))==NULL){//できるだけメモリを節約してみる return 0; }else{ line=tmp; } len=strlen(line); printf("line:%d:%d:%s\n",len,_msize(line),line); if(len>1){//ファイル終端の改行を排除 int i; char *tok=strtok(line,",");//カンマで区切ったアドレスを得る while(tok){ if(cnt==0)printf("tok:1st:%x\n",tok); if(cnt>3&&cnt%4==0){//サイズが足りなくなった時 char **tmp2; if((tmp2=(char **)realloc(words,sizeof(char *)*(4+4*(cnt%4))))==NULL){ printf("words realloc ERROR\n"); break; }else{ printf("realloc\n"); words=tmp2;//reallocを適用 } } words[cnt]=tok; if(cnt){ printf("line(func)"); for(i=0;i<len+1;i++){ printf("%c",words[0][i]); } printf("\n"); } tok=strtok(NULL,","); printf("words[%d]:%x:%s\n",cnt,words[cnt],words[cnt]); printf("\n"); printf("tok:%d回目:%x\n",cnt+1,tok); cnt++; } return cnt;//正常終了した }else{ free(line); } } return 0; } int main(){ FILE *fp=fopen("words.txt","r"); if(fp){ int cnt=1; while(cnt){ int i; char **words=(char **)malloc(sizeof(char *)*4); words[0]=NULL; cnt=readlinefile(fp,words); printf("mainに戻りました\n"); if(cnt) printf("words:%d\n",cnt); for(i=0;i<cnt;i++){ printf("words[%d]:%x:%s\n",i,words[i],words[i]); } free(words[0]); words[0]=NULL; printf("\n"); free(words); } }else{ printf("file open ERROR\n"); } return 0; } 実行結果 なぜかコピペできないので実行するか斧でダウンロードお願いします。 http://www1.axfc.net/u/3352789.txt 全てまとめたもの http://www1.axfc.net/u/3352796.zip

  • reallocの断片化対策について

    初めにお断りしておきたい事があります。 出先で緊急な事でしたので、今即興で書いたソースになります。 Cコンパイル環境が有りませんでしたので、動作確認がとれておりません。 その為、ケアレスミス等有るかもしれませんがご容赦願います。 例として標準入力より文字列を取得する処理を記述しました。 以下の処理でreallocの際の断片化対策となるでしょうか。 (最終的に*strにセットされている領域が断片化されていない事) 実際の処理では1行辺り0~30000文字程の可変長の文字列を読み込む事を想定しております。 C(windows)のみ可でC++は不可になります。 その他、冗長な記述等指摘が有りましたらよろしくお願い致します。 #define MAX_BUF_SIZE 128 int getText(char **str) { char *buf[MAX_BUF_SIZE]; char *tmp = NULL; int tmpsize = 0; if ((tmp = (char*) malloc(1)) == NULL) { return FALSE; } *tmp = '\0'; while (fgets(buf, MAX_BUF_SIZE, stdin) != NULL) { tmpsize += MAX_BUF_SIZE; if ((tmp = realloc(tmp, tmpsize)) == NULL) { free(tmp); return FALSE; } strcat(tmp, buf); } if (*str != NULL) { free(*str); } if (*str = (char*) malloc(strlen(tmp) + 1) != NULL) { return FALSE; } strcpy(*str, tmp); free(tmp); return TRUE; }

  • reallocについて

    現在、領域を拡張しながら、 ファイルを読み込んで呼び元に返却するPGを作成しています。 reallocがうまくいかないので、試しに小さいのを作って みましたが、これだとreallocの2度目で落ちます。 100文字ずつ呼んでいるので、拡張も100文字ずつ行っています。 メモリ確保に失敗なら、まだ分かるのですが、 ちょっと理由がわかりません。 reallocを複数繰り返していることも問題だと思いますが、 まずは正常に処理を流したいと考えています。 よろしくお願いします。 ~~~~~~ソース~~~~~~~~ //ファイルを読み込んでから領域を確保する #include <stdio.h> #include <string.h> #include <stdlib.h> #define BUFF 100 int main() { FILE *fp; char tmp[BUFF+1]; char *str; int len = 0; fp = fopen( "c:/test.txt" , "rb" ); if(fp ==0){ printf("ファイルがありません\n"); return -1; } //領域を初期化 str = (char *)malloc(1); memset(str,'\0',sizeof(str)); while(feof(fp)==0){ memset(tmp,'\0',sizeof(tmp)); fgets(tmp,BUFF,fp); //領域を再確保 len += BUFF+1; if(NULL == ((char *)realloc(str,len))){ printf("メモリ確保エラー"); } //読み込んだ値を変数に追加 strcat(str,tmp); } printf("文字列\n\n%s\n",str); printf("長さ:%d\n",len); fclose(fp); return 0; }

  • realloc関数の使い方

    前回のmalloc関数の使い方の続きみたいな感じです。 参考書にはmalloc関数とcalloc関数については載っていましたがrealloc関数については記述はありませんでした。 realloc関数はメモリの拡張や縮小ができるというみたいなのでdo~while文の中に入れています。 どこが間違っているのでしょうか。 /* 課題3-6 */ #include <time.h> #include <stdio.h> #include <stdlib.h> int user; /* プレーヤの手 */ int comp; /* コンピュータの手 */ int win_no; /* 勝った回数 */ int lose_no; /* 負けた回数 */ int draw_no; /* 引き分けた回数 */ int *a; int *b; int *a1; int *b1; int i; int stage = 0; 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); /* rireki関数の宣言 */ void rireki(void); /* メイン関数 */ int main(void) { int judge; /* 勝敗 */ int retry; /* もう一度 */ initialize(); /* 初期処理 */ a = (int *)calloc(5, sizeof(int)); b = (int *)calloc(5, sizeof(int)); do{ jyanken(); /* じゃんけん実行 */ /* コンピュータとプレーヤの手を表示 */ printf("私は%sで、あなたは%sです。\n", hd[comp], hd[user]); judge = (user - comp + 3) % 3; /* 勝敗を判定 */ count_no(judge); /* 勝/負/引分け回数を更新 */ disp_result(judge); /* 判定結果を表示 */ retry = confirm_retry(); a1 = (int *)realloc(a, sizeof(int) * (draw_no+lose_no+win_no+1)); b1 = (int *)realloc(b, sizeof(int) * (draw_no+lose_no+win_no+1)); rireki(); }while(retry == 1); for(i=0; i<draw_no+lose_no+win_no; i++){ printf("%d回目 ユーザ%c コンピュータ%c\n", i+1, hd[b1[i]], hd[a1[i]]); } printf("%d勝%d敗%d分けでした。\n", win_no, lose_no, draw_no); free(a); free(b); 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); } /*--- 履歴の表示 ---*/ /* rireki関数 */ void rireki(void) { a1[stage] = comp; b1[stage] = user; stage++; }

  • reallocの使い方について

    下記コードを実行すると,abendしてしまいます. 本来,alloc_testでは,htmlを取得して戻したい(htmlのサイズは可変)のですが,伸張ができず悩んでおります.ヒント等ご教示いただければ幸いです. また,修正方法の他,何故,下記コードがまずいのかについてもご説明いただければと思います. なお,コメントアウトにもあります通り,配列サイズを十分に大きくとり,reallocの処理を入れないなどの回避方法は望んでいません. //--ここから(全角スペースを使用しています) #include <stdio.h> #include <stdlib.h> int alloc_test(char *c){  char *t;  t=(char *)realloc(c, sizeof(char) * 100);  if(NULL==t)   return -1;  c=t;  return 0; } int main(void){  char *a="\0";  alloc_test(a);  return 0; } //--ここまで よろしくお願いいたします.

  • ポインタ(続)

    http://okwave.jp/qa5092628.html の続きです。 #include "stdafx.h" #include <ctype.h> #include <string.h> #include <stdlib.h> typedef struct { int number[6]; char *class_type; char *name; char *subject; } my; int main(int argc, char* argv[]) { FILE *fp; int field = 0, line = 0; char buf[1000], *str; char *bufNum,*bufClass,*bufName,*bufSub; int i; if((fp=fopen("test.txt","r"))==NULL){ printf("ファイルが開けません"); } my *data; data = (my *)calloc(112, sizeof(my)); if(!data){ printf("memoryが足りません\n"); } while(fgets(buf,1000,fp) !=NULL){ str=buf; bufNum = (char *)malloc(strlen(buf) + 1); bufClass = (char *)malloc(strlen(buf) +1); bufName= (char *)malloc(strlen(buf) + 1); bufSub = (char *)malloc(strlen(buf) +1); while(*str != '\0'){ if(*str != ','){ for(i = 0; *str != ',' && *str != '\0' ; i++){ if(*str == '\n'){ } else{ switch(field){ case 0: *bufNum = *Str; data[line].number[line] = atoi(bufNum); break; case 1: *bufClass= *str; data[line].class_type = bufClass; break; case 2: *bufName = *str; data[line].name = bufName; break; case3: *bufSub = *str; data[line].subject = bufSub; break; } } str++; } switch(field){ case 0: bufNum[i] = '\0'; break; case 1: bufClass[i] = '\0'; break; case 2: bufName[i] = '\0';break; case 3: bufSub[i] = '\0'; break; } field++; } else{ str++; } } line++; field = 0; } printf("%s", data[0].name); fclose(fp); return 0; } と作ってみましたがまぁこれも上手く動かないんですが・・ 1、構造体をつくる 2、構造体のメモリをとる 3、ファイルをよみこむ 4、ポインタで宣言した構造体のメンバのメモリをとり実体をつくる 5、一行ずつよみこむ 6、カンマごとに格納 7、格納後終端文字を入れる 格納の区別はカンマごとにfieldを+しfieldの値にて行なう lineは行数 8,printfでテスト表示 終わり という一連のプログラムです。 class_typeまでは正常にでるんですが nameからが入っていません。 他にもここが微妙とかいうのがあったら教えて下さい。 個人的にはbufNum~bufSubのメモリの取り方が大きすぎる とは思うんですが他にいい手もなくて・・

  • reallocでうまくメモリを拡張出来ていない?気がしますが・・・

    OS:WindowsXP SP3 コンパイラ:Visual C++ 2008Express Edition with Service Pack 1 質問なんですが、 ttp://homepage3.nifty.com/mmgames/c_guide/ ↑こちらの練習問題19の3-1なんですが、4人以上のデータを入力して showdata関数で表示させると4人目からのデータが入力したデータと 違います。 (reallocのところが間違っているような気がするのですが?です) どなたかアドバイスお願いします。 他の問題点も良ければアドバイス頂けると幸いです。 *******************以下自分で書いたソース******************** #include <stdio.h> #include <stdlib.h> //構造体 typedef struct { char name[64]; int age; int sex; } stat; //プロトタイプ宣言 int status(stat * ,int *); void showdata(stat *, int); int main() { int cnt, max = 3; //構造体ポインタの宣言 stat *data; //動的配列の宣言 data = (stat *)malloc(sizeof(stat) * max); if ( data == NULL ) { exit(0); } //入力用関数の呼び出し cnt = status(data, &max); //出力用関数の呼び出し showdata(data, cnt); //メモリの開放 free(data); return 0; } int status(stat *data, int *max) { int i = 0; //年齢に-1が入力されるまでループ do { if ( (i + 1) > (*max) ) { *max += 10; data = (stat *)realloc(data, sizeof(stat) * (*max) ); if ( data == NULL ) { exit(0); } } printf("名前入力:"); scanf("%63s", data[i].name); getchar(); fflush(stdin); printf("年齢入力(-1入力で入力終了):"); scanf("%d", &data[i].age); getchar(); //1か2でない場合再入力 do { printf("性別を入力(1.男性 2.女性) <1 or 2>:"); scanf("%d", &data[i].sex); getchar(); if ( (data[i].sex < 1) || (data[i].sex > 2) ) { data[i].sex = 3; printf("1か2で入力してください\n"); } } while ( (data[i].sex) == 3 ); i++; } while ( (data[i-1].age) != -1 ); return i - 1; } void showdata(stat *data, int cnt) { int i; for ( i = 0; i < cnt; i++ ) { printf("\n%d人目のデータ\n", i + 1); printf("名前:%s\n", data[i].name); printf("年齢:%d\n", data[i].age); if ( data[i].sex == 1 ) { printf("性別:男性\n"); } else { printf("性別:女性\n"); } } return; }

  • C#でラジオボタンを設定に記録する方法

    すみません、どなたかご存知のかた教えてください。 C#でグループボックスの上に20個くらいのラジオボタンが並んでいて、どれかをチェックした時設定として保存し、プログラムを再起動した時チェック状態を復元したいのですが、どのようにすれば良いでしょうか? Properties.Settings.Defaultで型をSystem.Windows.Forms.RadioButtonにして(RadioButton)senderを記憶するようにしてみましたが(プログラムが分かって無いからですが)だめでした。 現在はProperties.Settings.Defaultの型をstringにして、次のような形で動かしていますが、なんとかシンプル(スマート)にしたいのです。 private void Form1_Load(object sender, EventArgs e) { switch (Properties.Settings.Default.SelectedProgram) { case "Func1": radioButtonFunc1.Checked = true; break; case "Func2": radioButtonFunc2.Checked = true; break; case "Func3": radioButtonFunc3.Checked = true; break; default: break; } } //各ラジオボタン共通 private void radioButtonSelect_Click(object sender, EventArgs e) { string RadioButtonText = null; RadioButton _RadioButton = (RadioButton)sender; if (_RadioButton.Checked == true) { RadioButtonText = _RadioButton.Text; Properties.Settings.Default.SelectedProgram = RadioButtonText; switch (RadioButtonText) { case "Func1": textBox1.Text = "a"; break; case "Func2": textBox1.Text = "b"; break; case "Func3": textBox1.Text = "c"; break; default: break; } } } //プログラム開始ボタン private void buttonStart_Click(object sender, EventArgs e) { string RadioButtonText = null; foreach (RadioButton prgText in groupBox1.Controls) { if (prgText.Checked) { RadioButtonText = prgText.Text; break; } } switch (RadioButtonText) { case "Func1": Func1(); break; case "Func2": Func2(); break; case "Func3": Func3(); break; default: break; } } private void Func1() { } private void Func2() { } private void Func3() { }

  • c言語のmalloc関数、またrealloc関数

    c言語のmalloc関数は確保するメモリの領域を、配列としてのみしか処理出来ないのですか。 つまり、malloc関数で確保したメモリの領域を変数、また多次元配列、また構造体としては処理出来ないのでしょうか。 c言語のrealloc関数は以前の確保したメモリの領域から、確保し直したメモリの領域の場所が変わるかもしれないという事ですが、この場合の場所が変わるという意味は、メモリの領域のアドレスが変わるという事でしょうか。 また、以前の確保したメモリの領域に代入していたデータが使用出来なくなるという事でしょうか。