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

#include <string.h>
#include <stdlib.h>

int		main(void)
{
	char	*p0 = strdup("red..");
	char	*p1 = strdup("green");
	char	*p2 = strdup("blue.");
	char	**pp = malloc(sizeof(char *) * 4); /* I want to watch all accessible values through this pointer */

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

  /* do something */

	return (0);
}
  • У меня есть три строки, которые хранятся в динамически выделенной памяти.
  • Я сохраняю адреса этих строк в динамически выделяемом указателе на указатели на переменную char.

Что я хочу сделать

Когда выполнение программы останавливается в точке останова, я хочу отобразить все значения char, на которые указывает каждый указатель на char, указанный указателем на указатели на char, в представлении просмотра отладчика VSCode, вот так.

Если я хочу посмотреть один из указателей на char, на которые указывает pp

Добавьте это выражение просмотра в представление просмотра

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

и я смогу просмотреть 6 значений символов от pp[0][0] до pp[0][5].

Здесь я разыменовываю pp + 0 , а затем привожу его к указателю на массив из 6 символов.

Если я хочу посмотреть все значения char строк, на которые указывают указатели на char, на которые указывает указатель на указатель на char.

Если мой указатель на указатели на char (в моем случае pp) указывает на множество указателей на char (строки), и я хочу просмотреть все значения char, просто добавив одно выражение наблюдения, это способ сделать это.

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

Здесь я делаю приведение типа pp к указателю на массив из 4 указателей на массив из 6 символов.

Это даст мне это представление, когда программа остановится в точке останова.

Одна вещь, которую нужно иметь в виду

Не забывайте использовать условные точки останова.

В зависимости от сценариев это намного эффективнее, чем проверять значения глазами в режиме просмотра часов.