C

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
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。