gdb - 如何查看指针数组的内容?

Posted

技术标签:

【中文标题】gdb - 如何查看指针数组的内容?【英文标题】:gdb - how to view contents of an array of pointer? 【发布时间】:2017-09-19 00:08:02 【问题描述】:

我在获取变量“arr”的内容时遇到了问题,该变量是一个指针数组。 我试过了,p *arr@n,但它给出了以下输出:$1 = 0x603010, 0x603030。 我该怎么办?

int n, q;
scanf("%d %d", &n, &q);

int lastAnswer=0, index_size[n], *arr[n];  // <-- here
for(int i=0; i<n; i++)
    index_size[i] = 0;

for(int i=0; i<n; i++) 

    int *temp = malloc(sizeof(int)*n);
    arr[i] = temp;


while(q--) 
    int w, x, y, seq;
    scanf("%d %d %d", &w, &x, &y);

    if(w == 1) 

        seq = ((x ^ lastAnswer) % n);
        arr[seq][index_size[seq]++] = y;
    
    else 

        seq = ((x ^ lastAnswer) % n);
        lastAnswer = y%n;
        printf("%d\n", lastAnswer);
    


return 0;

【问题讨论】:

也许写一个漂亮的打印机?您可以为指针类型注册一个... ***.com/questions/14502236/… 【参考方案1】:

如果你打印出一个指针本身,它只会给你一个内存块中的地址。

所以print *arr@n 只会为您提供第一维的内容(输出中的地址数组)

如果你想打印出更深层次的内容。你可能想做这样的事情:

print **arr@n;

print *arr[0]@n

另一种方法是在程序中定义一个漂亮的打印函数并在 gdb 中调用它。

void print(int arr[][], n, m)

    int i, j;
    for (i = 0; i < n; ++i)
    
        for (j = 0; j < m; ++j)
            printf("%d ", arr[i][j]);
        printf("\n");
    

并在 gdb 中调用它

call print(arr, n, m)

我认为 gdb 本身不支持打印 2D 数组,为什么? 因为print *array@3的定义不是打印array中的前三个元素,而是“打印*array(或array[0])和array[0]后面的三个元素。

print **arr@n@n

在这种情况下不起作用,(尽管它打印出很好的格式)

【讨论】:

以上是关于gdb - 如何查看指针数组的内容?的主要内容,如果未能解决你的问题,请参考以下文章

如何查看数组指针指向数组的所有元素

对于C或C++语言,VS下调试如何查看指针数组的所指向的内容?谢谢指导.

GDB调试字符数组时指针和数组区别的体现

如何 gdb 如何打印一个地址中的内容

返回一个指向 char 数组的指针。如何打印出数组的全部内容?

C1数据类型,常量变量,输入输出,运算符,if/switch/循环,/数组,指针,/结构体,文件操作,/编译预处理,gdb,makefile,线程