我在创建自己的DLL时遇到了麻烦(供学术人员使用。)
在DLL项目的标头中(编译选项为“ C”), 我声明了导出三个函数
// in dll1 header
#pragma once
#ifdef MYDLL
#define MYDLL_API __declspec(dllexport)
#else
#define MYDLL_API __declspec(dllimport)
#endif
MYDLL_API int Mmalloc(int**, int);
MYDLL_API int Mfree(int**);
MYDLL_API int Arrsum(int*, int);
它们只是简单的功能。
和DLL .C
//in dll.c
#include "dll1.h"
#include <stdlib.h>
int Mmalloc(int** mem, int n) // just memory Allocation
{
*mem = (int*)malloc(sizeof(n)*sizeof(int));
if (*mem) return 1; // if succeed return 1
return 0; // or return zero
};
int Mfree(int** mem) // just memory Free
{
free(*mem);
return 1;
}
int Arrsum(int* arr, int n) // just some operate
{
int sum = 0;
for (int i = 0; i < n; i++)
{
sum += arr[i];
}
return sum;
}
带有“预处理定义”->“ MYDLL”以及“运行库”->“ / MD” 我建造它。
,然后创建另一个项目(编译选项“ default(c ++)”) 从DLL标头添加添加标头,添加外部“ C”
#pragma once
#ifdef MYDLL
#define MYDLL_API __declspec(dllexport)
#else
#define MYDLL_API __declspec(dllimport)
#endif
extern "C"
{
MYDLL_API int Mmalloc(int**, int);
MYDLL_API int Mfree(int**);
MYDLL_API int Arrsum(int*, int);
}
我还制作了main.cpp
#include <stdio.h>
#include <stdlib.h>
#include "dll1.h"
#define SZ 1000
int main()
{
int* arr=0;
int cnt = 0;
while (1)
{
int ret = Mmalloc(&arr, SZ);
printf(ret ? "YES\n" : "NO\n");
for (int i = 1; i <= SZ; i++)
{
arr[i - 1] = i;
printf("%d\n", arr[i - 1]);
}
printf("%d\n", Arrsum(arr, SZ));
printf("cnt : %d\n", ++cnt);
Mfree(&arr);
}
};
然后将* .dll和* .lib文件放置在正确的文件夹中。 片刻对我来说似乎不错,但我发现了一个大错误。
我在main.cpp中使用了while(1)
语法。
因此我的程序应该尽可能长时间地工作,但是它会在某些时候停止。
我不知道什么是真正的问题。
我更改了.dll项目以及main.cpp项目中的堆保留大小
但是我的主程序总是停止。
在调试模式下,它停止
或更大尺寸(SZ 10000〜100000)我有访问冲突
请帮助我。我什至无法想象真正的问题是什么。
dll中是否存在某些语法错误? (函数中的内存分配?) 要么 编译器问题? ,Windows?还是什么?...
答案 0 :(得分:4)
Mmalloc
分配4或8个整数(取决于系统上sizeof(n)
的值),而不是n
整数。然后,程序会通过缓冲区溢出表现出未定义的行为。