假设我有三个数组 a1[],a2[] 和 a3[]
。所有三个数组 (a1,a2,a3) 都指向各自数组的第一个元素。
在实现代码时,我声明:
int a1[]={1,2,3,4,5};
int a2[]={1,2,3,4,5};
int a3[]={1,2,3,4,5};
当我打印他们的地址时,地址的顺序开始为
(a3+0)=2337376::(a3+1)=2337380::(a3+2)=2337384::(a3+3)=2337388::(a3+4)=2337392
(a2+0)=2337396::(a2+1)=2337400::(a2+2)=2337404::(a2+3)=2337408::(a2+4)=2337412
(a1+0)=2337416::(a1+1)=2337420::(a1+2)=2337424::(a1+4)=2337428::(a1+4)=2337432
我的问题是,我在 a2 和 a3 之前声明了 a1。但 a1 的地址位于 a3 和 a2 的之后。如果先声明a1,那么它的地址应该是a2和a3中的最小值,或者换个思路,a1、a2、a3的地址应该没有关系。但是你可以看到 a2 的寻址是在 a3 之后开始的,而 a1 的寻址是在 a2 之后开始的。为什么?
我使用的代码是:
#include<stdio.h>
int main()
{
int i,a1[]={1,2,3,4,5};
int *p1=a1;
printf("\n Addresses of 1st array:\n");
for( i=0;i<5;i++)
{
printf("%d ",(p1+i));
}
int a2[]={1,2,3,4,5};
int *p2=a2;
printf("\n Addresses of 2nd array:\n");
for( i=0;i<5;i++)
{
printf("%d ",(p2+i));
}
int a3[]={1,2,3,4,5};
int *p3=a3;
printf("\n Addresses of 3rd array:\n");
for( i=0;i<5;i++)
{
printf("%d ",(p3+i));
}
}
我得到的输出是:
Addresses of 1st array:
2337440 2337444 2337448 2337452 2337456
Addresses of 2nd array:
2337408 2337412 2337416 2337420 2337424
Addresses of 3rd array:
2337376 2337380 2337384 2337388 2337392
我正在使用 CYGWIN 编译器
最佳答案
how does sequencing of address-allocation of arrays is done in C?
该语言没有指定如何分配不相关的数组。该语言要求单个数组中的项目具有特定的地址序列。给定
int a[] = {10, 20, 30};
语言保证
a < a+1
a+1 < a+2
和
numerical value of (a+1) - numerical value of (a) == sizeof(int)
numerical value of (a+2) - numerical value of (a+1) == sizeof(int)
但是,给定
int a[] = {10, 20, 30};
int b[] = {100, 200, 300};
该语言对 a+1
和 b+1
之间的关系不做任何 promise 。编译器可以自由选择如何为 a
和 b
分配内存。
通过检查a
和b
元素的地址值,可以判断编译器如何为数组分配内存。但只有当您有兴趣弄清楚编译器的工作原理时,才有兴趣。作为该语言的普通用户,您不应该关心这些关系,并且绝对不要编写任何依赖于这些关系的程序。
关于c - 如何在 C 中完成自动数组的排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37873726/