私は ANSI C コードを使用しています。これは、ネストされたいくつかのレイヤーとstruct
関数プロトタイプを生成するコード ジェネレーターから生成され、引数リストを使用して最上位レイヤーへのポインターを使用struct
して、内部 mmost にあるデータを渡したりアクセスしたりしますstruct
。
関数プロトタイプはポインターを構造体に渡すため、アプリケーションは最も内側の構造体メンバーにアクセスまたはデータを書き込むためにメモリを割り当てる必要があります。2 番目のネストされた構造体へのポインタにメモリを割り当てようとすると、問題が発生します。
実際に表示されるエラー メッセージは、致命的ではないランタイム メッセージです。
私は明示的に何もキャストしていないので、の実装に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);
}