Я использую Office 365 в 64-разрядной версии с ОС Windows 10.
Я компилирую свой файл .exe с сообществом Visual Studio 2017.
Каждый раз, когда я встречал функцию malloc()
, он сообщает о нарушении доступа к памяти.
Для меня почти невозможно отказаться от использования malloc
, так как есть некоторые API базы данных, которые также используются malloc
.
Ниже приведены кодыиз Excel (VBA):
Option Explicit
Public Declare PtrSafe Function ExcelCalc Lib "E:\AEONLIFE\CalcMProj\ActThread2\x64\Debug\ActThread2.exe" ( _
ByVal PlanCode As String, _
ByVal chnl As Long, _
ByVal sensi As Long, _
ByRef a As Double, _
ByRef b As Double) As Long
Dim a(0 To 1273) As Double
Dim b(0 To 1273) As Double
Sub test()
Dim c As Long
Dim PlanCode As String
c = ExcelCalc("502001", 1, 0, a(1), b(1))
End Sub
Ниже приведен код C:
extern __declspec(dllexport) int WINAPI ExcelCalc(char *PlanCode, int chnl, int scen, double *a, double *b)
{
#pragma region 初始化
//********** 本地变量 **********
double mfac = (double)1 / (double)YEARSTEP;
char TempPID[PlanIDLEN];
int Ind, PlanCodeInt;
DB dbconn;
pfdrv ProfDrv;
tData Data;
temp Temp;
//********** 申请堆空间 **********
cashflow *CashFlow = malloc(sizeof(cashflow));
sensi *Sensi = malloc(sizeof(sensi));
calcconst *CalcConst = malloc(sizeof(calcconst)*MAXCHNL);
cf_calc *CF_Calc_Base = malloc(sizeof(cf_calc));
rate_calc *RateCalc = malloc(sizeof(rate_calc));
decrate *DecRate = malloc(MAXCHNL * sizeof(decrate));
//********** 链接数据库 **********
if (dbconnect(&dbconn) == FAIL) { return 0; };
#pragma endregion
strcpy_s(&TempPID[0], sizeof(TempPID), PlanCode);
TempPID[4] = 0;
PlanCodeInt = atoi(&TempPID[0]);
LoadAsump(PlanCode, &dbconn, DecRate, CashFlow, Sensi, CalcConst, &ProfDrv, mfac);
Ind = LoadTemp(&Data, &Temp, DecRate, &CashFlow->GCV[0], &CashFlow->CFOutgo[chnl], mfac);
Calc_CashFlow(&Temp, CF_Calc_Base, &CashFlow->CFOutgo[chnl], &CalcConst[chnl], PlanCodeInt, mfac);
CalcDec(&Temp, &DecRate[chnl], RateCalc, &Sensi->SensiRT[scen][0], &CalcConst[chnl], mfac);
#pragma region 计算后处理
//********** 释放堆空间 **********
free(DecRate);
free(CashFlow);
free(Sensi);
free(CalcConst);
//********** 断开链接 **********
dbcleares(&dbconn);
PQfinish(dbconn.conn);
#pragma endregion
a[0] = 1;
a[1] = 3.5;
b[0] = 1;
b[1] = 7;
return 1;
}
Немного сложно, но в строке 12 появляется первая ошибка malloc (), как показано нижекартинка:
Это китайский и говорит о нарушении доступа к памяти по адресу 0x181FC1A.
Я сделал отладку сборки, кажется, я не сделалне загружать библиотеку, содержащую malloc.Я попытаюсь загрузить соответствующую библиотеку и попробую снова.
Спасибо !!