Я использую код ANSI C, созданный из генератора кода, который создает несколько слоев вложенных struct
, а также прототипы функций с списками аргументов, которые используют указатели для верхний слой struct
для передачи или доступа к данным, расположенным во внутренней mmost struct
.ANSI C Распределение памяти для указателя на struct throws нефатальная ошибка во время выполнения
Поскольку прототипы функций передают указатели на 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);
}
К сожалению, я должен немного отойти от своего стола, так что, если кто-то задаст вопрос относительно этого сообщения, я не игнорирую вас У, я вернусь, как только смогу, завтра в худшем случае. – ryyker
Вы должны выделить достаточно места для хранения 'struct data', а не' struct data * '. Аналогичным образом, вы должны выделить достаточно памяти для хранения 'REQUEST', а не' REQUEST * '. –
Как T.C. говорит, что во время выполнения вам сообщается, что вы не выделяете достаточное пространство для того, для чего объявляется 'c-> pData'. См. Http://zone.ni.com/reference/en-XX/help/370051M-01/cvi/programmerref/pointercastingnonfatal/ –