Как проверить значения динамически выделенной памяти в режиме отладки? - PullRequest
5 голосов
/ 02 декабря 2011

Я использую eclipse и netbeans для c, и я хотел бы проверить значения переменных, которые динамически распределяются в памяти при отладке (оба в eclipse и * 1004 NetBeans *).

по какой-то причине я могу видеть только значение самого указателя, и это первый элемент.

для иллюстрации: с этим кодом:

int foo[10];

Я могу проверить значение всего массива позже (при отладке). например, я могу проверить значение foo [7] в окне часов.

но с этим кодом:

int *bar = malloc(10*sizeof(int));

я могу только проверить, куда указывает bar и значение bar[0] (но не другие значения).

как посмотреть все значения массива?


ОБНОВЛЕНИЕ: проблема была решена как в Eclipse, так и в NetBeans.

в затмении: щелкните правой кнопкой мыши нужную переменную в окне Переменные -> выберите Показать как массив -> заполните начальный индекс и длину массива.

в netbeans: в окне Watches добавьте новые часы следующего формата:

*((bar)+0)@10

, где bar должно быть именем указателя, 0 должен быть вашим начальным индексом и 10 должно быть длиной

если я могу добавить что-то личное: это мое первое сообщение в stackoverflow . Я надеюсь, что вы нашли это полезным.

Ответы [ 2 ]

3 голосов
/ 02 декабря 2011

Поскольку вы используете переменную-указатель, единственное знание, которое может автоматически выводить инструмент отладки, это то, что у вас есть адрес в целочисленном значении. После этого факта вы можете иметь теоретически все, что стоит за вашим целочисленным значением, инструмент не сможет догадаться, что указатель фактически является первым элементом целочисленного массива.

Тем не менее, вы можете попытаться добавить собственное выражение наблюдения (по крайней мере, в Eclipse, я не знаю netbeans), которое приводит ваш указатель к целочисленному массиву. Я не знаю, можете ли вы использовать точную длину массива. Что-то вроде (int[])bar, безусловно, будет работать, но, возможно, эта форма может работать либо (int[10])bar.

Другое решение заключается в том, чтобы смотреть прямо в памяти на адрес указателя, но это скорее умственный спорт - преобразовать необработанный шестнадцатеричный вывод с прямым порядком байтов в целые значения ...

Теперь, если ваш указатель всегда выделяется блоку памяти из 10 целых чисел, вам следует рассмотреть возможность статического выделения его с использованием формы массива int bar[10];

2 голосов
/ 02 декабря 2011

Я не знаю, будет ли это работать в Eclipse или Netbeans, но вы можете попробовать добавить часы на *(bar + 1) для второй «записи».Однако вы, вероятно, не сможете использовать bar в качестве массива, если только отладчик не позволит вам типизировать его в массив (например, (int[])bar, который я понятия не имею, будет ли он вообще работать в реальном C).

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