在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输出有一个'详细'描述。
答案 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
之后直接c
和b
后直接{/ 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.
威廉。