Значение указателя изменено в обработчике начала синтаксического анализа XML - PullRequest
1 голос
/ 30 марта 2012

У меня есть указатель типа int, значение которого по какой-то причине изменяется, как только оно передается из основного. Этот файл использует команду expat XML_Parse. Вот соответствующий код:

Структура, в которой я устанавливаю значения:

struct song_data {

   float *freq_array;
   int *freq_array_count;
   int *freq_duration_array;
};

Часть (большая часть) основной:

int main(int argc, char **argv) {
    const int BUFFER_SIZE = 8192;
    char buffer[BUFFER_SIZE];

struct song_data * wav = (struct song_data *)malloc(sizeof(struct song_data));
    *wav->freq_array_count=0;

    XML_Parser parser = XML_ParserCreate(NULL); //create parser
    XML_SetElementHandler(parser, start, end);
    XML_SetUserData(parser, &wav);

    FILE *xml_file = fopen(argv[1], "r");
    int done = 0;



    while (!done) {
    int length = fread(buffer, sizeof(char), BUFFER_SIZE, xml_file);
        done = feof(xml_file);
        XML_Parse(parser, buffer, length, done);
    }

И обработчик запуска:

void start(void *data, const char *tag, const char **attributes) {
    struct song_data *song_data = (struct song_data *) data;
    printf("in start, freq_array_count=%d\n,*song_data->freq_array_count);
// rest of code
}

printf в стартовом обработчике печатает какое-то странное значение, например -7194902 или что-то еще (сервер, на котором я работал, в данный момент не работает).

Другой подход, который я попробовал (и предпочел бы, если бы я мог выяснить, как заставить его работать), заключается в том, чтобы int *freq_array_count был просто целым (int freq_array_count) ... однако это также получает странное значение немедленно при первом вызове обработчика запуска (что-то выше 100 000 000)

Почему? Мне кажется, что значение int в подходе, принятом здесь, не должно быть изменено, поскольку оно указывает на часть памяти, которую я явно просил.

В другом подходе его также не следует изменять, поскольку int относится к структуре в куче и, следовательно, не должен изменяться.

Почему это происходит?

1 Ответ

0 голосов
/ 30 марта 2012

Как вы узнаете, что * данные были присвоены действительным данным?К вашему сведению, я не вижу, как вызывается start, не могли бы вы опубликовать вызов, чтобы я мог увидеть, на что * данные указывают?

О, я вижу проблему, замените XML_SetUserData (parser, & wav) на XML_SetUserData (parser, wav), поскольку переменная wav уже является типом указателя, и вам не нужен адрес указателя, а вам нужен адрес кучи памяти, на которую указывает wav.

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