Не удалось прочитать значение из struture в C после его присвоения - PullRequest
1 голос
/ 23 ноября 2010

У меня странное поведение программы при попытке прочитать значение из структуры после присвоения ей значения. Я показываю соответствующую структуру и функции ниже:

/*Data struct for cor_entry */
struct cor_entry {
    struct cor_entry * pre_entry;
    struct cor_entry * next_entry;
    long long unsigned int entry_data;
};

Я прокомментировал большую часть своей функции, чтобы выделить проблему:

/* update correlation table */
void cor_table_update(long long unsigned int cor_table_data, 
    struct cor_entry **cor_table_head_ptr, 
    struct cor_entry **cor_table_tail_ptr, 
    int *entry_num, 
    const int MAX_NUM)
{
    struct cor_entry *cor_table_entry;
    int cor_hit=0;

    //test code 
    //cor_table_head=cor_table_tail=(struct cor_entry*)calloc(1, sizeof(struct cor_entry));
    //printf("original cor_entry_num=%d\n",*entry_num);

    ////////////////////////code for test///////////////////////////////

    cor_table_entry=(struct cor_entry*)calloc(1, sizeof(struct cor_entry));
    printf("The cor_table_entry=%x\n",cor_table_entry);
    cor_table_entry->entry_data=cor_table_data;
    if (cor_table_entry->entry_data==cor_table_data)
    { 
        printf("The assignment is correct!\n");
        printf("the cor_enrty_data=%x, stored data=%x,\n",
            cor_table_data,
            cor_table_entry->entry_data);
    }

    // ... rest of function
}

И я получаю этот вывод при запуске программы:

The cor_table_entry=8c09a58
The assignment is correct!
the cor_enrty_data=8ffc8, stored data=0,
The cor_table_entry=8c09a70
The assignment is correct!
the cor_enrty_data=8ffc8, stored data=0,
The cor_table_entry=8c09a88
The assignment is correct!
the cor_enrty_data=8ffc8, stored data=0,
The cor_table_entry=8c09ae8

Может ли кто-нибудь пролить свет на эту проблему? Я использую компилятор GCC-3.4.6.

Ответы [ 2 ]

4 голосов
/ 23 ноября 2010

Попробуйте скомпилировать с -Wall. Затем GCC должен сообщить вам, что размеры спецификаторов формата % и аргументов printf() не совпадают. Попробуйте %llx вместо %x. Это должно решить проблему.

0 голосов
/ 23 ноября 2010

Ваша проблема, вероятно, связана с printf,% x не предназначен для отображения длинных длинных без знака.Разделите значение перед печатью, и это будет то, что вы ожидаете.

Вы также можете использовать спецификатор формата %llx, если ваш компилятор поддерживает его.

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