【发布时间】:2019-12-17 10:23:41
【问题描述】:
我在stackoverflow上快速搜索后发布了这个......
我无法从 GDB 打印 VLA 条目,这是我的精简 C 片段。
#include <stdio.h>
#include <stdlib.h>
typedef struct
{ int i, j;
} c_t;
int f(int l, int c, c_t a[l][c])
{ for(int i=0;i<l;i++)
{ for(int j=0;j<c;j++)
{ a[i][j].i=i; a[i][j].j=j;
}
}
}
int main(int ac, char **av)
{ int l=(int)atoi(av[1]), c=(int)atoi(av[2]);
c_t a[l][c];
return(f(l,c,a));
}
我编译它
$ cc -o g g.c -g -O0
然后在其上运行 GDB,在 f() 中进行几次迭代后,我尝试显示 a[i][j]
$ gdb ./g
GNU gdb (Ubuntu 8.1-0ubuntu3) 8.1.0.20180409-git
...[snip]...
Reading symbols from ./g...done.
(gdb) r 2 3
Breakpoint 1 at 0x76b: file g.c, line 17.
Breakpoint 1, main (ac=3, av=0x7fffffffe608) at g.c:17
17 { int l=(int)atoi(av[1]), c=(int)atoi(av[2]);
(gdb) n
18 c_t a[l][c];
(gdb)
19 return(f(l,c,a));
(gdb) s
f (l=2, c=3, a=0x7fffffffe440) at g.c:8
8 int f(int l, int c, c_t a[l][c])
(gdb) n
9 { for(int i=0;i<l;i++)
(gdb)
10 { for(int j=0;j<c;j++)
(gdb)
11 { a[i][j].i=i; a[i][j].j=j;
(gdb)
10 { for(int j=0;j<c;j++)
(gdb)
11 { a[i][j].i=i; a[i][j].j=j;
(gdb)
10 { for(int j=0;j<c;j++)
(gdb)
11 { a[i][j].i=i; a[i][j].j=j;
(gdb)
10 { for(int j=0;j<c;j++)
(gdb)
9 { for(int i=0;i<l;i++)
(gdb) p a[0][0]
Cannot perform pointer math on incomplete types, try casting to a known type, or void *.
(gdb)
从那里我被卡住了,尝试了各种演员都没有成功。
提前感谢任何指针(可能是指针比数组更好:))
披
【问题讨论】:
-
感谢大家的建议,我无法找到正确的转换语法。 @jxh,但是让我大吃一惊的是,如果您运行此测试程序,请在 f() 调用 init a[][] 上执行“n”(下一个),然后返回 main(),您现在可以执行 pa [0][0],那么为什么 p[0][0] 在 main() 中没有强制转换而不在 f() 中有效?
标签: c gdb dynamic-arrays variable-length-array