У меня есть указатель типа 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 относится к структуре в куче и, следовательно, не должен изменяться.
Почему это происходит?