分段故障问题

时间:2014-02-20 14:00:41

标签: c pointers struct gdb segmentation-fault

我有这个结构:

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(来自gdb),trackSN为1。

一旦我点击语句: temp =(U32 *)startPointer-> pMessage; ,当我尝试打印startPointer-> pMessage的值时,它说:无法访问地址0x8的内存

解决问题的任何帮助?

3 个答案:

答案 0 :(得分:2)

没有问题,是吗?

你说IntMsg是0,所以这个:

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

startPointer设置为0.然后取消引用该无效指针,导致未定义的行为(段错误)。

混合类型非常混乱,很难理解你尝试在这里实现的目标,对我而言。

答案 1 :(得分: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只是查看RxBufferArray [trackSN]的Memory address + sizeof(UINT),可能是0x8,由于该内存未初始化,因此无法访问此内存,您会看到错误无法访问内存地址0x8

答案 2 :(得分:1)

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

您没有为RX_BUFFER_STRUCT数组中的每个“Msg”结构分配内存。

我看到两种解决方法。所有这些都基于您使用的编程原则。 首先,如果您只是用数据填充“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;
}
相关问题