2014-02-20 5 views
0

У меня есть эта структура:Проблема с ошибкой сегментации

typedef struct Msg 
{ 
    MsgType msgType; 
    INT msgLen; 
    VOID *pMessage; 
    UINT No; 
}Msg; 

Я определил указатель:

Msg *startPointer = NULL; 

Тогда я делаю:

startPointer = (Msg *)RxBufferArray[trackSN].IntMsg; 

Где

RX_BUFFER_STRUCT RxBufferArray[100]; 

И

typedef struct RX_BUFFER_STRUCT_T { 
    UINT seqNum; 
    Msg *IntMsg; 
} RX_BUFFER_STRUCT; 

Тогда я делаю:

temp = (U32 *)startPointer->pMessage; 

Что дает мне ошибку сегментации. Значение RxBufferArray [trackSN] .IntMsg является 0x0 (от БГД), и trackSN равен 1.

Как только я попал заявление: температура = (U32 *) startPointer-> pMessage;, когда я пытаюсь напечатать значение startPointer-> pMessage, он говорит: не удается получить доступ к памяти по адресу 0x8

Любая помощь в решении вопроса?

+0

указатель указывает на не обеспечивается. – BLUEPIXY

+1

Где вы инициализировали массив 'RxBufferArray'? если вы не инициализируете, вы столкнетесь с такими обстоятельствами. – Dipto

+0

где вы выделяете память для 'RxBufferArray [trackSN] .IntMsg'? – Heeryu

ответ

1
typedef struct RX_BUFFER_STRUCT_T { 
    UINT seqNum; 
    Msg *IntMsg; //this is just pointer, no structure behind it 
} RX_BUFFER_STRUCT; 

You не выделяйте память для каждой структуры «Msg» в массиве RX_BUFFER_STRUCT.

Я вижу два пути решения проблемы.Все они основаны на принципах программирования, которые вы используете. Во-первых, если вы просто заполнить свой "Msg" структуру с данными:

typedef struct RX_BUFFER_STRUCT_T { 
    UINT seqNum; 
    Msg IntMsg; //now this is not pointer, this is structure here 
} RX_BUFFER_STRUCT; 

И с помощью:

startPointer = (Msg *)&RxBufferArray[trackSN].IntMsg; //I added "&" 
temp = (U32 *)startPointer->pMessage; 

Во-вторых, когда вы получаете уже заполнены структура:

typedef struct RX_BUFFER_STRUCT_T { 
    UINT seqNum; 
    Msg *IntMsg = 0; //this is still pointer 
} RX_BUFFER_STRUCT; 

Добавление данных :

Msg *tempMsg = (Msg*)calloc(sizeof(Msg)); 
memcpy(tempMsg, inputMsg, sizeof(Msg)); //inputMsg is pointer to filled structure 
RxBufferArray[trackSN].IntMsg = tempMsg; 

Используя данные:

if(RxBufferArray[trackSN].IntMsg == 0){ 
    return; 
}else{ 
    startPointer = (Msg *)RxBufferArray[trackSN].IntMsg; 
    temp = (U32*)startPointer->pMessage; 
} 

Теперь вы в первую очередь проверьте, если вы заполнили структуру, а затем использовать данные.

UPD: как добавить данные:

//global variables 
int buffer_head = 0; //for writing 
int buffer_tail = 0; //for reading 
RX_BUFFER_STRUCT RxBufferArray[100]; 

void addData(Msg *inputMsg){ 
    Msg *tempMsg = (Msg*)calloc(sizeof(Msg)); 
    memcpy(tempMsg, inputMsg, sizeof(Msg)); //inputMsg is pointer to filled structure 
    RxBufferArray[buffer_head++].IntMsg = tempMsg; 
} 

//main function for example 
int main(){ 
    Msg message; //creates structure 
    message.pMessage = calloc(30*sizeof(char)); //allocates memory for message string 
    message.msgLen = sprintf((char*)message.pMessage, "Test message"); //fills message 
    addData(&message); //adds message to buffer 
return 0; 
} 
+0

inputMsg имеет тип и как указать его на заполненную структуру? Прошу прощения. – aod

+0

Спасибо за обновление. Мой вопрос: когда вы вызываете addData из main, будет ли обновляться только один индекс RxBufferArray? Или все 100? Я думаю только один, то есть 0-й индекс. Это? И когда мы пытаемся разыменовать индекс 1, происходит то же самое, что и раньше (авария)? – aod

+0

Сбой произошел из-за того, что «RxBufferArray [trackSN] .IntMsg« указывал никуда ». И когда он указывает на никуда, вы не можете получить к нему доступ. –

2

Нет проблем, не так ли?

Вы говорите, что IntMsg является 0, так что:

startPointer = (Msg *) RxBufferArray[trackSN].IntMsg; 

множества startPointer к 0. Тогда вы разыменовываются, что недопустимый указатель, вызывает неопределенное поведение (выдаёт ошибку сегментации).

Смешивание типов очень сбивает с толку, очень сложно понять, что вы , пытаясь найти для меня здесь.

1

В вашей структуре:

typedef struct RX_BUFFER_STRUCT_T { 
    UINT seqNum; 
    Msg *IntMsg; 
} RX_BUFFER_STRUCT; 

Когда вы объявляете массив RX_BUFFER_STRUCT, это не инициализировать IntMsg указателя и выделение памяти для этого должно быть сделано явно. Вот почему вы пытаетесь сослаться на это, его NULL.

Теперь снова, когда вы сделаете это задание:

startPointer = (Msg *)RxBufferArray[trackSN].IntMsg; 

типажей среди различных структур должны быть тщательно обработаны. startPointer-> pMessage просто смотрит на Memory address + sizeof(UINT) из RxBufferArray [trackSN], который, вероятно, 0x8, и как эта память не доступна, так как его не инициализирован, вы видите ошибку не может получить доступ к памяти по адресу 0x8

+0

Не могли бы вы предложить изменения? Не знаете, как инициализировать и где. – aod

+0

И структурная переменная не указатель! – aod

Смежные вопросы