Serious Memory Clash: Variables clashing in C
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开发者_Python百科->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);
}
Here there is a serious memory clash, in two variables of different scope. I have investigated using gdb and it seems the address of new_Message->Time
is equalling to the address of Check->Time
.
They both are structures of different types I am trying to resolve this issue, because, when parser changes the value of new_Message->Time
it manipulates the contents of Check->Time
Please do suggest how to solve this problem. I have lost(spent) around 10 hours and counting to resolve this issue, and tons of hair.
Soham
EDIT STRUCTURE DEF ADDED
You're using an address of the stack allocated object to initialize new_Message->Time = &a[2][11];
Although you don't show us how you initialize Check
which limits the amount of help we can give, there is an unnecessary parameter to parse()
which you can remove.
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);
}
When you look at that skeleton, it may be easier to see that:
a. The value in main()
passed to parser()
as newMessage
is undefined because the local variable has not been initialized, but
b. It doesn't matter much because the first thing that happens in parser()
is that a value is allocated and assigned to the function's copy of the uninitialized value (new_Message
), thus initializing the value used in parser()
.
So, the code is 'safe', but could be written as:
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);
}
It is best not to pass values to functions that are not used.
Also, most people either use underscores to separate words in names or use camelCase
names, but not usually camel_Case
which combines both.
精彩评论