Ошибка в простом C-коде (указатели) - PullRequest
0 голосов
/ 31 октября 2010

В следующем коде с использованием библиотек libxml:

key = xmlNodeListGetString(doc, cur3->xmlChildrenNode, 1);
                if (flag == 1)
                {
                        image2 = key;
                        printf("the image 2 is %s \n", image2);
                        flag = 2;
                }
                if(flag == 0)
                {
                        image1 = key;
                        printf("the image 1 is %s \n", image1);
                        flag = 1;
                }
                    //printf("SRC of the file is: %s\n", key);

                xmlFree(key);
            printf("the image 1 is %s \n", image1);

два printf дают мне разные выходные данные.

Выходные данные:

the image 1 is 1.png 
the image 1 is 0p�  g 
the image 2 is 2.png 
the image 1 is 0p�  g

Ответы [ 3 ]

6 голосов
/ 31 октября 2010

После того, как строки image1 = key, image1 и key указывают на одну и ту же область памяти.

Полагаю, xmlFree(key); изменяет эту область памяти.Если вы хотите, чтобы содержимое этой строки сохранилось до xmlFree, вам следует рассмотреть возможность использования функции strcpy перед освобождением указателя.

0 голосов
/ 31 октября 2010

Насколько я вижу из этого короткого фрагмента недокументированного кода, на самом деле не имеет смысла вызывать xmlfree (), который преобразует, например, 1.png в 0p� г.

, нонастоящая причина, по которой var image1 изменяется, заключается в том, что image1 является ссылкой на ключ, который затем обновляется с помощью вызова xmlfree (key).

0 голосов
/ 31 октября 2010

Вы не упомянули, что такое image1 и key?Я думаю, указатели (из-за тега и из-за имени функции + c-тега).Если это так, проблема заключается в вызове xmlFree(key); перед вызовом printf - и key, и image1 указывают на одно и то же место в памяти (если указатели), так что это проблема.Поставьте xmlFre(key) после printf.

Также вы должны добавить else перед вторым if (:

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