Serious Memory Clash: Переменные, конфликтующие в C - PullRequest
0 голосов
/ 18 февраля 2011
    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);
    }

Здесь происходит серьезное столкновение памяти в двух переменных различной области видимости. Я исследовал с помощью GDB, и кажется, что адрес new_Message->Time равен адресу Check->Time.

Они оба являются структурами разных типов Я пытаюсь решить эту проблему, потому что, когда парсер изменяет значение new_Message->Time, он манипулирует содержимым Check-> Time

Пожалуйста, предложите, как решить эту проблему. Я потерял (потратил) около 10 часов и считаю, что решить эту проблему, и тонны волос.

Soham

РЕДАКТИРОВАТЬ СТРУКТУРА DEF ДОБАВЛЕНА

Ответы [ 2 ]

6 голосов
/ 18 февраля 2011

Вы используете адрес выделенного стека объекта для инициализации new_Message-> Time = & a [2] [11];

5 голосов
/ 18 февраля 2011

Хотя вы не показываете нам, как инициализировать 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);
}

Когда вы смотрите на этот скелет, может быть легче увидеть, что:

а. Значение в main(), переданное parser() как 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);
}

Лучше не передавать значения в функции, которые не используются.

Кроме того, большинство людей либо используют подчеркивание для разделения слов в именах, либо используют camelCase имена, но обычно не camel_Case, который объединяет оба.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...