C言語の領域確保について
C言語を始めたばかりのものです。 配列を計算させようと下のようなプログラムを作り、一応動作はするのですが、配列の領域確保がいまいちわかりません。配列はcsvから値をとっています。確保する領域は、代入する値の数でいいので、buff[8×64]、とかarv[4×32]でいいと思い、それより少し大きな値くらいで実行すると失敗してしまいます。
自分の理解の仕方が間違っているとは思っているのですが、(char *)malloc(M*N*sizeof(char))でやっても失敗しました。どうすればよいかお教え願います。ちなみに、csvの値は0.000852354710804709のように桁が半端ないです。
またfgetsのライン数の値も正しくするにはどうすればよいのでしょうか。できたらmallocを使えたらよいと思っています。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define N 8 //8行
#define M 64 //64列
int main()
{
char *fname = "test.csv";//8行64列
char *ffname = "tk.csv";//4行32列
FILE *IN1, *IN2, *OUT1, *OUT2;
char buff[100000];//←問題の部分
char *pbuff;
char arv[400];//←問題の部分
char *parv;
double a[N][M+30], b[N][M], c[N][M], w[4][32];
int i, j, x;
double m, n;
int count=0;
if((IN1 = fopen(fname, "r")) == NULL){
printf("can't open the %s", fname);
return 0;
}
if((IN2 = fopen(ffname, "r")) == NULL){
printf("can't open the %s", ffname);
return 0;
}
i=j=0;//配列の取得
while(fgets(buff, 100000, IN1) != NULL){
pbuff = buff;
while((pbuff = strtok(pbuff, ",\n")) != NULL){
a[i][j++] = strtod(pbuff, NULL);
pbuff = NULL;
}
i++;
j=0;
}
i=j=0;//配列の取得
while(fgets(arv, 400, IN2) != NULL){
parv = arv;
while((parv = strtok(parv, ",\n")) != NULL){
w[i][j++] = strtod(parv, NULL);
parv = NULL;
}
i++;
j=0;
}
:
:
:
このプログラムでも計算はできるのでいいのですが、最終的には500行2048列の計算をしないといけないので、いっそう数字が膨大となるために質問させていただきました。Visual Stdio 2010 c/c++ 使ってます。
お礼
gcc バージョン 3.2.3 20030502 (Red Hat Linux 3.2.3-20) を使用しておりますが、きちんと書くにはcallocやmallocで領域を確保して 確保されたかどうか確認した方が良いんですね。 小さな領域を使う場合には確保されない事はほとんどありえないと思いますので、気にする事もないのかも知れませんが、大きい領域を使用する場合は callocやmallocで領域を確保するようにする事にします。 ありがとうございました。