2

MSDN 状态

...因此,当返回 DLL 创建的字符串或浮点数组时,您有以下选择:

  • 设置一个指向动态分配缓冲区的持久指针,返回该指针。在下一次调用函数时 (1) 检查指针是否不为空,(2) 释放上一次调用分配的资源并将指针重置为空,(3) 将指针重新用于新分配的内存块。...

拨打免费电话时出现以下错误对话框:

MSVC++ Debug Library HEAP CORRUPTION DETECTED: after Normal block(#135) at 0x....... CRT 检测到应用程序在 heap 缓冲区结束后写入内存。

这是我的代码:

FP * g_FP;

extern "C" FP * __stdcall xllFill(long rows, long cols) {

    if (g_FP != NULL) {
        free(g_FP);
        g_FP = NULL;
    }
    g_FP = (FP *)malloc(rows * cols * sizeof(double) + 2 * sizeof(unsigned short int));

    for (int i = 0; i < rows * cols; i++) {
        (*g_FP).data[i] = (double)i;
    }
    (*g_FP).rows = (unsigned short int)rows;
    (*g_FP).cols = (unsigned short int)cols;
    return g_FP;
}

我对 C++ 有点生疏,但我一辈子都想不通为什么这不起作用。

4

3 回答 3

2

FP声明如下:

typedef struct _FP
{
    unsigned short int rows;
    unsigned short int columns;
    double array[1];        /* Actually, array[rows][columns] */
} FP;

您假设它FP已打包并且不包含填充。我不知道 XLL 是如何编译的,但我认为很有可能在8 字节对齐columnsarray排列之间存在填充。array使用默认设置,MSVC 返回 16sizeof(FP)支持我的假设。

将您的分配更改为:

g_FP = malloc((rows*cols-1)*sizeof(double) + sizeof(*g_FP));

即使这不是您的问题的原因,上面的分配也是逻辑上正确的形式。

否则我看不出你的代码有什么问题。我认为您可以更明确地初始化g_FPNULL但这是次要的。

于 2011-10-10T11:40:08.760 回答
1

sizeof(FP)是 16,因为行和列最终对齐(大概)。在我的手动尺寸计算中,我不允许这样做。

更好的代码是:

g_FP = (FP *)malloc(sizeof(sizeof(FP) - sizeof(double) + rows * cols * sizeof(double)); // -sizeof(double) to account for the double[1] already in the struct def.
于 2011-10-10T11:51:06.267 回答
0

省点麻烦,使用http://nxll.codeplex.com中的 FP 类。它的文档是http://nxll.codeplex.com/wikipage?title=FP

于 2011-11-05T15:30:34.633 回答