struct Message
{
char type;
double idNum;
char *Time;
char *asset;
bool BS;
float price1;
int shares1;
float price2;
int shares2;
};
typedef struct Message Message;
struct Asset
{
oBook *OrderBook;
Trade *TradeBook; //will point to the latest trade
int QtyTraded;
float ValueTraded;
char* Time;
};
typedef struct Asset Asset;
int main(int argc, char*argv[])
{
Message* newMessage;
Asset* Check;
//manipulation and initialization of Check, so that it holds proper values.
newMessage = parser("N,2376,01/02/2011 09:15:01.342,JPASSOCIAT FUTSTK 24FEB2011,B,84.05,2000,0,0",newMessage);
// MessageProcess(newMessage,AssetMap);
printf("LAST TRADE ADDRESS %p LAST TRADE TIME %s\n",Check->TradeBook,Check->Time);
}
Message* parser(char *message,Message* new_Message)
{
char a[9][256];
char* tmp =message;
bool inQuote=0;
int counter=0;
int counter2=0;
new_Message = (Message*)malloc(sizeof(Message));
while(*tmp!='\0')
{
switch(*tmp)
{
case ',': if(!inQuote)
{
a[counter][counter2]='\0';
counter++;
counter2=0;
}
break;
case '"':
inQuote=!inQuote;
break;
default:
a[counter][counter2]=*tmp;
counter2++;
break;
}
tmp++;
}
a[counter][counter2]='\0';
new_Message->type = *a[0];
new_Message->Time = &a[2][11];
new_Message->asset = a[3];
if(*a[4]=='S')
new_Message->BS = 0;
else
new_Message->BS = 1;
new_Message->price1=atof(a[5]);
new_Message->shares1=atol(a[6]);
new_Message->price2=atof(a[7]);
new_Message->shares2=atol(a[8]);
new_Message->idNum = atoi(a[1]);
return(new_Message);
}
Run Code Online (Sandbox Code Playgroud)
这里存在严重的内存冲突,在两个不同范围的变量中.我已经调查过使用gdb,它的地址似乎new_Message->Time等于地址Check->Time.
它们都是我试图解决这个问题的不同类型的结构,因为,当解析器更改new_Message->Time它的值时,它会操纵Check-> Time的内容
请建议如何解决这个问题.我已经失去了(花了)大约10个小时,并计算解决这个问题,和大量的头发.
Soham
编辑结构DEF添加
您正在使用堆栈分配对象的地址来初始化new_Message-> Time =&a [2] [11];
虽然您没有向我们展示如何初始化Check哪些限制了我们可以提供的帮助量,但parse()您可以删除一个不必要的参数.
int main(int argc, char **argv)
{
Message *newMessage;
Asset *Check;
[...]
newMessage = parser("N,2376...,0,0", newMessage);
[...]
}
Message *parser(char *message, Message *new_Message)
{
[...]
new_Message = (Message *)malloc(sizeof(Message));
[...]
return(new_Message);
}
Run Code Online (Sandbox Code Playgroud)
当你看到那个骨架时,可能更容易看到:
一个.main()传递给parser()as 的值newMessage是未定义的,因为局部变量尚未初始化,但是
湾 这并不重要,因为发生的第一件事parser()是分配一个值并将其分配给函数的未初始化值(new_Message)的副本,从而初始化中使用的值parser().
因此,代码是"安全的",但可以写成:
int main(int argc, char **argv)
{
Message *newMessage;
Asset *Check;
[...]
newMessage = parser("N,2376...,0,0");
[...]
}
Message *parser(char *message)
{
[...]
Message *new_Message = (Message *)malloc(sizeof(Message));
[...]
return(new_Message);
}
Run Code Online (Sandbox Code Playgroud)
最好不要将值传递给未使用的函数.
此外,大多数人使用下划线来分隔名称中的单词或使用camelCase名称,但通常不会camel_Case将两者结合使用.