我正在编写一个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中都很好。
答案 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,在那里你可以看到像
这样的内容