私は単純な分子動力学プログラムを実装したいと考えています。私の最初のステップは、タイプ、id番号、3次元位置ベクトル、3次元速度ベクトルを持つ一連の原子としてシステムを定義することです。以下は、私がそうすることを書いたプログラムは次のとおりです。ここで最後のコード行にSegフォルトがあります
FILE *init;
static int randomVelocity(void)
{
return rand()/RAND_MAX - 0.5;
}
int main(int argc, char *argv[])
{
int iType;
int iID;
int i;
double* pdPosition;
double* pdVelocity;
char* line;
Atom* poAtoms;
int count = 0;
init = fopen("newdat.txt", "r+");
srand((unsigned)time(NULL));
line = malloc(81*sizeof(char));
while (fgets(line, 80, init) != NULL)
{
char* tok1;
char* tok2;
char* tok3;
char* tok4;
tok1 = strtok(line, " \t");
if ((tok1 == NULL) || (tok1[0] == '*'))
{
break;
}
tok2 = strtok(NULL, " \t");
tok3 = strtok(NULL, " \t");
tok4 = strtok(NULL, " \t");
iType = atoi(tok1);
iID = count;
pdPosition = (double*)malloc(3*sizeof(double));
pdVelocity = (double*)malloc(3*sizeof(double));
pdPosition[0] = atof(tok2);
pdPosition[1] = atof(tok3);
pdPosition[2] = atof(tok4);
pdVelocity[0] = randomVelocity();
pdVelocity[1] = randomVelocity();
pdVelocity[2] = randomVelocity();
poAtoms[count] = Atom_new(iType, iID, pdPosition, pdVelocity);
count++;
}
for (i = 0; i < count; i++)
{
Atom_print(poAtoms[i]);
Atom_free(poAtoms[i]);
}
free(line);
return 0;
}
は、ヘッダファイルatom.hです:
/**** atom.h ****/
typedef struct Atom_str *Atom;
Atom Atom_new(int iType, int iID, double* adPosition, double* adVelocity);
void Atom_free(Atom oAtom);
void Atom_print(Atom oAtom);
とテスト入力ファイル:
1 5 7 9
2 12 13 14
プログラム私はそれを実行すると、期待される出力がsegフォールトに続く。私はGDBデバッガを使用していますが、segフォルトはreturn文の後の最後のコード行で発生するようです。それはメモリ管理の問題ですか?
これらのタイプは、多くの場合、メモリの破損に関連する参考になります。 GDBのクラッシュの後に "bt"とタイプしてスタックトレースがあるかどうか確認し、もしそうならポストできますか?またはValgrindを使用します。 –
これはあなたが参照していたスタックトレースですか? #0 0x0804b3fd? () の#1 0x00000001 () #2 0xffffd8b4? () #3 0xffffd8bc? () #4 0x00722828? () #5 0x00000000? () – user1125353