开发者

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.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜