【问题标题】:Pointer value changed in XML parse start handlerXML 解析开始处理程序中的指针值已更改
【发布时间】:2012-03-30 03:12:08
【问题描述】:

我有一个 int 指针,由于某种原因,它的值在从 main 传出后立即被修改。该文件使用 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 (int freq_array_count)...但这也有一个奇怪的值第一次调用启动处理程序时立即(超过 100,000,000)

为什么?我觉得 int 值,在此处采用的方法中,不应该被修改,因为它指向我明确要求的内存的一部分。

在另一种方法中,它也不应该被修改,因为 int 属于堆上的结构,因此不应该被修改。

为什么会这样?

【问题讨论】:

  • 您访问freq_array_count 没有分配它,也许它不应该是一个指针?另外,您真的应该将用户数据设置为 wav 指针的地址(即指向指针的指针)吗?

标签: c xml pointers xml-parsing


【解决方案1】:

您如何知道 *data 已分配给有效数据?仅供参考,我看不到 start 是如何被调用的,您能否发布调用以便我查看 *data 指向的内容?

哦,我看到了问题,将 XML_SetUserData(parser, &wav) 更改为 XML_SetUserData(parser, wav) 因为变量 wav 已经是指针类型,您不想要指针的地址,而是想要wav 指向的堆内存。

【讨论】:

  • 抱歉,我在编辑时不小心遗漏了 main 中的结构声明。如果你现在看,它应该是有道理的。在XML_SetUserData(parser, &wav) 中,我们告诉XML 库我们要修改的void *data 是我们的结构。因此,我们知道我们总是可以将它直接转换为结构。至少,我是这么理解的。
猜你喜欢
  • 2021-11-18
  • 2022-11-29
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 2022-11-02
  • 2016-09-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多