2011-12-02 62 views
0

我正在编写一个ANSI C程序,并有一个地方我找不到一个错误。我是C新手,所以不要打折明显。C函数之间传递数组调试

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

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

第二个文件包含main()函数。这包括,除了别的以外,可变的挡板的声明为:

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

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

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

然后这个数组传递到另一个文件(文件3)作为一个参数在下面的函数调用:

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(我观察file2中执行此操作时)。

有人能帮我理解当它进入file3时发生了什么? (为什么它与传入file3之前相比有所不同)。我应该提到其他数组(aa,bb,cc)显示相同的行为,尽管标量(dd,ee)在file3中表现良好。

+0

你的问题不是很清楚的事情,和你的避风港没有公布真正的代码,但我认为你对将数组传递给函数感到困惑。请参阅http://c-faq.com/aryptr/aryptrparam.html和http://c-faq.com/aryptr/aryparmsize.html。 –

+0

APRON如何与APRON_TIE相关?同样,什么是垃圾箱?你不是很清楚...... –

回答

1

gdb注意如何声明变量。

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

在第二个文件中,箱被声明为指向int的指针。指向int的指针的大小是8个字节(假设你在64位机器上)。要求gdb打印一个指针的值会产生一个十六进制值,就像你观察到的一样。然而,你也观察到你可以使用bin作为数组的基础并且像APRON一样索引它 - 所以你可以通过说bin [0],bins [1],...来获得数组元素的值。垃圾箱[2]等。您所报告的一切听起来就像我期望的那样。

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

+0

不,APRON是int不是int数组。你必须说APRON []有一个数组 –

+0

有没有办法,一旦在最后一个文件中,让gdb打印整个数组,而不是一次只打印一个元素(例如在第一个文件中完成)?我假设即使我传递另一个参数是数组的长度,gdb也不会识别它(或者它比那更聪明?)。 – ggkmath

+1

在gdb中尝试'p * bins @ 8'。 –

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 hereenter image description here

+0

谢谢当我复制代码并简化它时,我有一个错字。它应该读取int APRON [8] = {...}。我上面纠正了。 – ggkmath

+1

+1史诗级DDD截图。 :) – unwind

+0

和你+1作为一个DDD粉丝。调试链表时,它经常挽救我的生命。传播这个词! – Mawg