Как посмотреть символьные значения строк, на которые указывает указатель на указатели в режиме отладчика VSCode - PullRequest
1 голос
/ 06 августа 2020

Допустим, я работаю с этой программой C.

  • У меня есть три строки, которые хранятся в динамически выделяемой памяти.
  • Я сохраняю адреса для этих строки в динамически выделяемом указателе на переменную указателей.
#include <string.h>
#include <stdlib.h>

int     main(void)
{
    char    *p0 = strdup("red..");
    char    *p1 = strdup("green");
    char    *p2 = strdup("blue.");
    char    *p3 = NULL;
    char    **pp = malloc(sizeof(char *) * 4); /* I want to watch this in VSCode debugger */

    pp[0] = p0;
    pp[1] = p1;
    pp[2] = p2;
    pp[3] = p3;

  /* do something */

    return (0);
}

Чего я хочу достичь

Как мне получить отображение значений char в режиме просмотра отладчика VSCode (и, если возможно, адреса) строк, на которые указывает каждый указатель, например:

<watch_expression_for_pp>: <address of pp>
   |- pp[0]: [6] <address of pp[0]>
   |     |--- [0]: 'r'
   |     |--- [1]: 'e'
   |     |--- [2]: 'd'
   |     |--- [3]: '.'
   |     |--- [4]: '.'
   |     |--- [5]: '\0'
   |
   |- pp[1]: [6] <address of pp[1]>
   |     |--- [0]: 'g'
   |     |--- [1]: 'r'
   |     |--- [2]: 'e'
   |     |--- [3]: 'e'
   |     |--- [4]: 'n'
   |     |--- [5]: '\0'
   |
   |- pp[2]: [6] <address of pp[2]>
   |     |--- [0]: 'b'
   |     |--- [1]: 'l'
   |     |--- [2]: 'u'
   |     |--- [3]: 'e'
   |     |--- [4]: '.'
   |     |--- [5]: '\0'
   |
   |- pp[3]: [6] <0x0000000000000000>
         |--- [0]: 'r'
         |--- [1]: 'a'
         |--- [2]: 'n'
         |--- [3]: 'd'
         |--- [4]: 'o'
         |--- [5]: 'm'

То, что я уже знаю

Я знаю, что если я добавлю (char(*)[6])pp[0] в качестве выражения наблюдения, Я смогу просмотреть 6 значений символов от pp[0][0] до pp[0][5], но это не идеальное решение, если я имею дело с сотнями указателей и мне нужно go быстро перебирать значения.

смотреть значения char в одной строке

Я ищу способ добавить одно выражение для наблюдения и получить представление, подобное приведенному выше, точно так же, как когда я смотрю связанный список в отладчике. Или совершенно другой подход, например, использование расширения.

1 Ответ

1 голос
/ 06 августа 2020

Это должно сработать:

(char (*(*)[4])[6])pp

введите описание изображения здесь

Как видите, вы уже были очень близки!

Конечно, используемые вами строки могут не иметь фиксированного размера, поэтому второе измерение [6] не будет точным и, вероятно, должна соответствовать самой длинной ожидаемой строке. Следовательно, для более коротких строк вы можете увидеть некоторые гиббери sh из соседних ячеек памяти.

PS: (char (*(*)[4]))pp также будет работать

...