我正在使用 ANSI C 代码,它是从代码生成器生成的,该代码生成器生成多层嵌套struct
以及带有参数列表的函数原型,这些参数列表使用指向顶层的指针来struct
传递或访问位于内部 mmost 中的数据struct
。
因为函数原型将指针传递给 struct,所以应用程序必须分配内存来访问或向最内部的 struct 成员写入数据。我在尝试为指向第二个嵌套结构的指针分配内存时看到了问题。
我得到的实际错误消息是非致命的运行时:“没有足够的空间将表达式转换为'指向结构数据的指针'。”
我没有明确地投射任何东西,所以我怀疑 的实现malloc()
可能有一个断言,当它看到某些条件时会生成消息。此错误的措辞可能特定于我的环境(我使用的是 LabWindows/CVI),但我也有兴趣了解其他 ANSI C 编译器的结果。
这是一个简化的、完整的代码片段,应该编译、构建和运行(直到错误位置,它是在线注释的)
我将不胜感激对我的错误原因的评论,以及如何解决它的建议。
#include <ansi_c.h> //specific to LabWindows/CVI - change as needed for your environment
struct request
{
struct data *pData;
};
struct data
{
char *wsDate;
char *wsDuration;
char *wsFailures;
int __sizeM_Details;
struct details *M_Details;
};
struct details
{
char *wsStep;
char *wsTestDesc;
char *wsLowLim;
};
typedef struct request REQUEST; // from mtdf function prototype request argument (4)
typedef struct details DETAILS; // member of REQUEST - _ns1__MTDFData_MTDFDetail
void allocate(REQUEST *a, int numRecords);
void freemem(REQUEST *c, int numRecords);
int main(void)
{
REQUEST b, *pB;
pB = &b;
allocate(pB, 10);
freemem(pB, 10);
return 0;
}
void allocate(REQUEST *c, int numRecords)
{
DETAILS m_Param;
REQUEST b;
struct data d;
size_t size_c = sizeof(c);
c = malloc(size_c); //4 bytes
size_t size_c_data = sizeof(c->pData);
c->pData = malloc(size_c_data); //Breaks here - this is just a pointer,
//should it not just allocate 4 bytes
//and continue?
// Actual error message:
// "Not enough space for casting expression to 'pointer to struct data'."
c->pData->wsDate = calloc(80, sizeof(char));
c->pData->__sizeM_Details = numRecords;
c->pData->M_Details = calloc((numRecords + 1) , sizeof(m_Param));
}
void freemem(REQUEST *c, int numRecords)
{
free(c->pData->M_Details);
free(c->pData->wsDate);
free(c->pData);
free(c);
}