为什么两个变量共享同一个地址?

时间:2014-09-24 11:14:42

标签: c variables gcc overlap memory-address

在iMac,OsX 10.5上使用gcc 4.0.1版,

已为某些变量分配了相同的地址 作为二维数组中的第二组元素。

如何防止编译器以这种方式分配地址?

包含一个演示问题的程序:

#include <stdio.h>

long a[1][10];
long b;
long c;

int main()
{
    printf( "Address of a[0][0]: %p\n", &a[0][0] );
    printf( "Address of a[0][1]: %p\n\n", &a[0][1] );
    printf( "Address of a[1][0]: %p\n", &a[1][0] );
    printf( "Address of a[1][1]: %p\n\n", &a[1][1] );
    printf( "Address of b: %p\n", &b );
    printf( "Address of c: %p\n\n", &c );
}

输出:

Address of a[0][0]: 0x2040
Address of a[0][1]: 0x2044

Address of a[1][0]: 0x2068
Address of a[1][1]: 0x206c

Address of b: 0x2068
Address of c: 0x206c

如果需要,我对gcc输出有一个'详细'描述。

4 个答案:

答案 0 :(得分:5)

因为您将数组定义为long a[1][10]。这意味着您只能访问a[0][N]

请记住,当您定义数组的大小时,您最多可以索引N-1

答案 1 :(得分:4)

您正在打印出不存在的地址。

printf(&#34; [1] [0]的地址:%p \ n&#34;,&amp; a [1] [0]);

由于您将a声明为long a[1][10];,因此没有&a[1][0],这超出了您的数组维度。仅存在a[0][0 to 9]

答案 2 :(得分:1)

long a[1][10]将为堆栈上的10个长值保留空间。 a将指向第一个元素。 long b会为一个长值保留空间,long c也会保留空间。 b将在a之后直接cb后直接{/ 1}}。

a[1][0]将指向位于a的第一个元素之后的长值的10倍1倍的元素。这将是b

a[1][1]将指向a的第一个元素后面的长值大小(10倍1加1)的元素。在这种情况下,这将是c

这是您观察相同地址的原因。

答案 3 :(得分:0)

nos,&amp; 斯特芬

谢谢你的及时回复...我看到了(现在明显的)我的方式错误!

我使用Qbasic学习编程,其中;

DIM a(1,10)  AS INTEGER  'the subscripts give the maximum array value...
                         'and not the number of elements in the array.

...是一个2 * 11阵列。

我和我正在努力尝试转换&#39;到C.

威廉。