Передача указателя: другое значение в стеке? - PullRequest
0 голосов
/ 20 января 2011

Я делаю:

typedef struct {
    Scene *scene;
    MeshStore *store;
    float angle;
} DebugModel

...
free_entire_store(debug_model.store);

/* Frees the store and any meshes related to it */
void free_entire_store(MeshStore *store) {
   /* implementation not important for the problem at hand */
}

Теперь, если я установил gdb, установив точку останова в начале free_entire_store, я получу следующие странные данные ..

(gdb) p debug_model  
$5 = {scene = 0x1044a680, store = 0x1044a630, angle = 87.8401108}  
(gdb) p store  
$6 = (MeshStore *) 0x10438b40

debug_model isглобальный, вышеприведенный вывод отладки происходит из той же точки в программе.

Итак, хотя я просто передаю указатель в качестве параметра, он каким-то образом изменяется.Стек поврежден, хотя и очень предсказуемым образом (одни и те же данные появляются при каждом запуске).Что могло вызвать это?Я не думаю, что я освободил что-либо дважды или что-то еще до вызова этой функции.Как значение, переданное в качестве параметра, может не соответствовать значению в стеке?

Ответы [ 2 ]

0 голосов
/ 20 января 2011

Вы уверены, что правильно установили точку останова? Возможно, хранилище еще не назначено, особенно если вы скомпилированы с оптимизацией. Попробуйте разбить после первой строки метода, чтобы убедиться, что он уже назначен.

0 голосов
/ 20 января 2011

Я думаю, это потому, что вы делаете копию указателя в функции, чтобы он мог быть изменен локально. Оба должны указывать на одно и то же.

Если вы хотите использовать один и тот же указатель внутри функции и снаружи, вы должны передать указатель на указатель.

typedef struct {
    Scene *scene;
    MeshStore *store;
    float angle;
} DebugModel

...
free_entire_store(&(debug_model.store));

/* Frees the store and any meshes related to it */
void free_entire_store(MeshStore **store) {
    MeshStore *originalStore = *store;
    /* implementation not important for the problem at hand */
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...