我有这个结构:
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的内存
解决问题的任何帮助?
答案 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;
}