C调试在函数之间传递数组

时间:2011-12-02 05:23:01

标签: c

我正在编写一个ANSI C程序,并且在我无法找到的地方有一个错误。我是C的新手,所以不要忽视这一点。

我正在使用三个文件。第一个是我使用#include“myheader.h”包含在其他2个文件中的头文件。在这个头文件中,除其他外,我有一个函数原型:

double function1(double *, double *, double *, int *, int, int);

第二个文件包含main()函数。除其他外,这包括将变量APRON声明为:

int APRON[8] = {1, 2, 3, 4, 5, 6, 7, 8};

在此文件中使用gdb我观察到:

(gdb) p APRON 
$1 = {1, 2, 3, 4, 5, 6, 7, 8}

然后在以下函数调用中将此数组作为参数传递给另一个文件(file3):

zz = function1(aa, bb, cc, APRON, dd, ee);

在file3中,该函数定义为:

double function1(double *aa, double *bb, double *cc, int *bins, int dd, int ee)  

当gdb进入此文件3时,我立即观察:

(gdb) p bins
$3 = (int *) 0x7fffffffe390

虽然我在这里愚弄了格式(不知道我在做什么)并观察到:

(gdb) p bins[0]
$5 = 1
(gdb) p bins[1]
$6 = 2
(gdb) p bins[2]
$5 = 3
(gdb) p bins[3]
$6 = 4
(gdb) p bins[4]
$5 = 5
(gdb) p bins[5]
$6 = 6
(gdb) p bins[6]
$5 = 7
(gdb) p bins[7]
$6 = 8

为什么gdb会改变这个数组的输出?另外,有趣的(以一种糟糕的方式),我看到:

(gdb) p sizeof(bins)
$36 = 8

当它应该是4 * 8 = 32时(正如我在文件2中所做的那样)。

有人可以帮我理解这个数组在进入file3时发生了什么吗? (为什么它与传递到file3之前相比在这里看起来有所不同)。我应该提到其他数组(aa,bb,cc)显示相同的行为,尽管scalars(dd,ee)在file3中都很好。

2 个答案:

答案 0 :(得分:1)

gdb会关注你的变量的声明方式。

在第一个文件中,APRON被声明为int数组。因此sizeof()返回整个数组的大小,gdb的p命令显示整个数组。

在第二个文件中,bin被声明为指向int的指针。指向int的指针大小为8个字节(假设您使用的是64位计算机)。并且要求gdb打印指针的值将产生十六进制值,就像你观察到的一样。

然而,您还观察到您可以使用bin作为数组的基础并将其索引就像APRON一样 - 因此您可以通过使用bin [0],bin [1],bin来获取数组元素值[2]等。你报告的所有内容都听起来就像我期望的那样。

当您将APRON传递给function1()时,您只是传递数组的地址。 function1()对数组的大小一无所知。您的代码必须知道数组有多长并且不会超过它的末尾,或者您需要在function1()中包含另一个参数来指示数组中元素的数量。

答案 1 :(得分:1)

简短回答:你在GHDB中得到两种不同的行为,因为你有两种不同的声明。

我甚至不相信int APRON = {1, 2, 3, 4, 5, 6, 7, 8};是合法的 - 但显然这是因为你的代码是合法的。链接(但是,它既不直观也不易于维护)。)

该参数的函数原型是int *bins

为什么不将它们都声明为int[8],而不是弄清楚两个声明之间有什么区别呢?

制作typedef int apront_t[8]并使用它。这将使你的生活更加简单,imo


顺便说一下,如果你是在Linux上开发,请查看DDD,在那里你可以看到像enter image description here enter image description here

这样的内容