gpt4 book ai didi

debugging - 如何在gdb中打印二维数组值

转载 作者:行者123 更新时间:2023-12-04 04:37:27 27 4
gpt4 key购买 nike

当我使用 gdb 调试我的代码时,遇到了一个让我头疼的问题,这是我的代码片段:

int getMaxProfits( int *boards, int length, int consecutive )
{
int optBoards[length+3][length+3];
memset(optBoards, 0, sizeof( optBoards ) );

for( int i = length -1; i >= 0; i-- )
{
for( int j = i; j <= length - 1; j++ )
{
if( j == i )
{
optBoards[i][j] = boards[j];
}
else if( j - i < consecutive )
{
optBoards[i][j] = boards[j] + optBoards[i][j-1];
}
.....

当我尝试打印出二维数组“optBoards”中的所有元素时
p optBoards

我发现事情并不像我想象的那么容易,它给了我
$1 = 0x7fff5fbff330

看起来像一个内存地址,然后我试过了
p optBoards[0][0]

我有
Cannot perform pointer math on incomplete types, try casting to a known type, or void *.

我一直在努力
ptype optBoards

我看见
type = int [][0]

我疯狂地猜测 optBoards 应该是一个指向一维数组的指针,因此我再次尝试
p (int[][0])(*optBoards)[0] 

我又得到了一个内存地址
$2 = 0x7fff5fbff330

我看到了一些希望并再次尝试
p (int[][0])*((*optBoards)[0])

现在我得到一个大 0
$3 = 0x0

我以为我已经得到了我想要的值,后来我在进入 for 循环后发现,optBoards 会被分配一些值,但无论如何,对于 optBoards 的所有元素,我总是得到一个大 0。我觉得很失落。

我应该怎么做才能打印出这个二维数组的正确值?

您的帮助将不胜感激。

最佳答案

你可以这样做 p ((int (*)[8]) optBoards)[6][2] , 而 8length + 3 .例如我有:

#pragma GCC diagnostic ignored "-Wunused-variable"
#pragma GCC diagnostic ignored "-Wunused-but-set-variable"

#include <stdio.h>

int foo(int length) {
int optBoards[length + 3][length + 3];
int i, j, q;

for( i = 0, q = 0 ; i < length + 3 ; i++ ) {
for( j = 0 ; j < length + 3 ; j++ ) {
optBoards[i][j] = ++q;
printf("optBoards[%d][%d] = %d\n", i, j, q);
}
}

return 0;
}

int main(int argc, char **argv) {
foo(5);
return 0;
}

您可以将数组数据检查为:
> gcc -Wall file.c -g -o file.exe

> gdb -q file.exe
Reading symbols from file.exe...done.
(gdb) l 18
13 optBoards[i][j] = ++q;
14 printf("optBoards[%d][%d] = %d\n", i, j, q);
15 }
16 }
17
18 return 0;
19 }
20
21 int main(int argc, char **argv) {
22
(gdb) b 18
Breakpoint 1 at 0x4017eb: file file.c, line 18.
(gdb) run
Starting program: file.exe
[New Thread 2912.0xad8]
optBoards[0][0] = 1
...
optBoards[1][2] = 11
...
optBoards[2][7] = 24
...
optBoards[6][2] = 51
...
optBoards[7][7] = 64

Breakpoint 1, foo (length=5) at file.c:18
18 return 0;
(gdb) p length + 3
$1 = 8
(gdb) p ((int (*)[8]) optBoards)[0][0]
$2 = 1
(gdb) p ((int (*)[8]) optBoards)[1][2]
$3 = 11
(gdb) p ((int (*)[8]) optBoards)[2][7]
$4 = 24
(gdb) p ((int (*)[8]) optBoards)[6][2]
$5 = 51
(gdb) p ((int (*)[8]) optBoards)[7][7]
$6 = 64
(gdb)

关于debugging - 如何在gdb中打印二维数组值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19497339/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com