こんにちは先日は失礼しました。データを保持するためにポインタの配列をつかっているのですが配列を大きくすると動作を停止してしまいます。スタックには2MBまでしかデータが入らないヒープにするためにmallocを使えといわれましたが、ポインタの配列を動的にmallocする方法がわかりません。どうすればint function(char *buf[]);の引数のbufを動的に確保できるようになりますか?
nt main(void)
{
int i,tablesize;
char ret;
char *buf[50000000000];
FILE *fp;
fp=fopen("in.txt","r");
for(i=0;i<1023;i++)buf=(char*)malloc(sizeof(char)*1024);
//何かの処理をする
function(buf);
}
ポインタの配列を動的に確保する
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: ポインタの配列を動的に確保する
もうひとつの方の質問で、解決チェックした上に投稿してくださいね。質問が解決したことがわかりませんので。
それと今回ので 50000000000 * 1024を確保したいのか目標サイズを教えて下さい。
50000000000 だとcharでも49GBなので物理的に普通のPCではmallocであろうと確保不可能ですけどね。
あと、なぜこういう確保が必要なのかやりたい事を教えて下さい。たぶん設計方針が間違っていると思います。
それと今回ので 50000000000 * 1024を確保したいのか目標サイズを教えて下さい。
50000000000 だとcharでも49GBなので物理的に普通のPCではmallocであろうと確保不可能ですけどね。
あと、なぜこういう確保が必要なのかやりたい事を教えて下さい。たぶん設計方針が間違っていると思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
もみじふぇにっくす
Re: ポインタの配列を動的に確保する
40万行のテキストファイルを読み込もうとしています.一行は200バイトあればだいじょうぶだとおもいます.ファイル自体は15メガバイトくらいあります。405000個の配列を宣言すると動作が停止してしまいます。
int main(void)
{
int i,tablesize;
char ret;
char *buf[405000];
FILE *fp;
fp=fopen("in.txt","r");
i=0;
buf=(char*)malloc(sizeof(char)*201);
while(fgets(buf,200,fp)!=NULL){
printf("%d\n",i);
i++;
buf=(char*)malloc(sizeof(char)*201);
}
tablesize=i;
}
int main(void)
{
int i,tablesize;
char ret;
char *buf[405000];
FILE *fp;
fp=fopen("in.txt","r");
i=0;
buf=(char*)malloc(sizeof(char)*201);
while(fgets(buf,200,fp)!=NULL){
printf("%d\n",i);
i++;
buf=(char*)malloc(sizeof(char)*201);
}
tablesize=i;
}
Re: ポインタの配列を動的に確保する
405000個の配列変数も、mallocで確保すればいいんでない?もみじふぇにっくす さんが書きました:405000個の配列を宣言すると動作が停止してしまいます。
char **buf = (char**)malloc(sizeof(char*) * 405000);
int j;
for ( j = 0; j < 405000; j++ ) {buf[j]=NULL;} // NULLで初期化written by へにっくす
Re: ポインタの配列を動的に確保する
free(NULL);ってできましたっけ。。h2so5 さんが書きました:NULLチェックする意味はないのでもう少し簡潔に書けます。
まあプロセスを抜ける後始末の処理なのでいいのかもしれませんが。
written by へにっくす
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: ポインタの配列を動的に確保する
200文字が入るバッファに読み込んで、strlenでサイズを調べた後mallocしたほうが効率は良くなりますね。
あとは皆さんの言う通り、405000個のポインタ配列を先に確保しておくのがひとつの方法で、リスト構造というのを使ってどんどん拡張していくのが別の方法です。
あとは皆さんの言う通り、405000個のポインタ配列を先に確保しておくのがひとつの方法で、リスト構造というのを使ってどんどん拡張していくのが別の方法です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
もみじふぇにっくす
Re: ポインタの配列を動的に確保する
みなさんありがとうございます。ポインタのポインタをつかった方法でうまくよみこめました。リスト構造は難しそうなのでもうすこし詳しくなってからつくってみます
int main(void)
{
long i,tablesize,reta;
char ret,findtxt[1024];
// char *buf[400000];
FILE *fp;
fp=fopen("data.txt","r");
char **buf = (char**)malloc(sizeof(char*) * 405000);
long j;
for ( j = 0; j < 405000; j++ ) {buf[j]=NULL;} // NULLで初期化
i=0;
buf=(char*)malloc(sizeof(char)*201);
while(fgets(buf,200,fp)!=NULL){
i++;
buf=(char*)malloc(sizeof(char)*201);
}
tablesize=i;
}
int main(void)
{
long i,tablesize,reta;
char ret,findtxt[1024];
// char *buf[400000];
FILE *fp;
fp=fopen("data.txt","r");
char **buf = (char**)malloc(sizeof(char*) * 405000);
long j;
for ( j = 0; j < 405000; j++ ) {buf[j]=NULL;} // NULLで初期化
i=0;
buf=(char*)malloc(sizeof(char)*201);
while(fgets(buf,200,fp)!=NULL){
i++;
buf=(char*)malloc(sizeof(char)*201);
}
tablesize=i;
}
Re: ポインタの配列を動的に確保する
関数内でstaticをつけて宣言するという方法もあったと思いますが、環境依存でしょうか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)