Q.動的にメモリを確保するには
A.double *a=malloc(sizeof(double)*m*n);
または
int i;
double **a=malloc(sizeof(double)*m);
for(i=0;i<m;i++)
a[i]=malloc(sizeof(double)*m);
連続した領域に確保するほうが動作が高速なようです
使い勝手もあるのでひとそれぞれです
また確保と同時に0リセットも行いたい場合は
calloc(m*n,sizeof(double);
または
int i;
double **a=malloc(sizeof(double)*m);
for(i=0;i<m;i++)
a[i]=calloc(m,sizeof(double));
Q.デバッグ
A.ケースバイケースですが
行列ベクトル積など
インクルードや仕様について調べたいとき
もっとも簡単な場合について
Q.サブルーチン内でのmalloc
A.非奨励だけれども、どうしても必要な時は
//サブルーチンまロック
#include<stdio.h>
#include<stdlib.h>
int n=3;
void sub(int *a){
int i;
a=malloc(sizeof(int)*n);
for(i=0;i<n;i++)
a[i]=i+1;
}
void sub2(int **a){//常に間接参照する
int i;
*a=malloc(sizeof(int)*n);
for(i=0;i<n;i++)
(*a)[i]=i+1;//*a[i]ではNG.()でくくるべし
}
int main(){
int i;
int *a;
sub(a);
for(i=0;i<n;i++)
printf("a[%d]=%d\n",i,a[i]);
int *b;
sub2(&b);
for(i=0;i<n;i++)
printf("b[%d]=%d\n",i,b[i]);
}
/*
$ ./a.exe
a[0]=2019885153
a[1]=327781
a[2]=-904658944
b[0]=1
b[1]=2
b[2]=3
aはNG,bが正しい
*/
Q.メモリ使用量の計測
- getrusage()関数 -> 最大値しか計測できない。しかも挙動不審
- getpagesize()関数 -> 固定値が返る
A.仕方ないのでwin32APIのGetProcessMemoryInfo()関数を使う.
windows.hとpsapi.hをインクルードする.コンパイル時にpsapi.libの
リンクが必要.
mem.c
#include<stdio.h>
#include<windows.h>
#include<psapi.h>
int get_mem(){
PROCESS_MEMORY_COUNTERS memInfo = {0};
GetProcessMemoryInfo( GetCurrentProcess(), &memInfo, sizeof(memInfo) );
return memInfo.WorkingSetSize;
}
int main(){
printf("mem = %d KB\n",get_mem()/1024);
int *a=malloc(sizeof(int)*10e6);
printf("mallocしました\n");
printf("mem = %d KB\n",get_mem()/1024);
free(a);
printf("freeしました\n");
printf("mem = %d KB\n",get_mem()/1024);
}
コンパイル&実行結果
nec@nec-5a400bcbfab /cygdri
$ gcc mem.c -lpsapi
nec@nec-5a400bcbfab /cygdri
$ ./a.exe
mem = 1660 KB
mallocしました
mem = 1924 KB
freeしました
mem = 1840 KB
Q.出力ファイルが途中で切れてる
A.32bitOSでは2Gまでのファイルしか出力できない。分割する
最終更新:2011年03月15日 05:10