在C语言中,自动数组的排序是如何完成的?

在C语言中,自动数组的排序是如何完成的?,c,arrays,pointers,cygwin,C,Arrays,Pointers,Cygwin,假设我有三个数组a1[],a2[]和a3[]。所有三个数组(a1、a2、a3)都指向各自数组的第一个元素。 在实现代码时,我声明: inta1[]={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

假设我有三个数组
a1[],a2[]和a3[]
。所有三个数组(a1、a2、a3)都指向各自数组的第一个元素。 在实现代码时,我声明:

inta1[]={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));
    }

}
我正在使用CYGWIN编译器

如何在C中对数组的地址分配进行排序

该语言不指定如何分配不相关的数组。该语言要求单个数组中的项具有特定的地址序列。给定

int a[] = {10, 20, 30};
语言保证

a < a+1
a+1 < a+2 
然而,鉴于

int a[] = {10, 20, 30};
int b[] = {100, 200, 300};
该语言没有承诺
a+1
b+1
之间的关系。编译器可以自由选择如何为
a
b
分配内存

通过检查
a
b
元素的地址值,可以判断编译器是如何为数组分配内存的。但是,只有当您对了解编译器的工作方式感兴趣时,这才有意义。作为该语言的常规用户,您不应该关心这些关系,并且绝对不要编写依赖于这些关系的任何程序

如何在C中对数组的地址分配进行排序

该语言不指定如何分配不相关的数组。该语言要求单个数组中的项具有特定的地址序列。给定

int a[] = {10, 20, 30};
语言保证

a < a+1
a+1 < a+2 
然而,鉴于

int a[] = {10, 20, 30};
int b[] = {100, 200, 300};
该语言没有承诺
a+1
b+1
之间的关系。编译器可以自由选择如何为
a
b
分配内存


通过检查
a
b
元素的地址值,可以判断编译器是如何为数组分配内存的。但是,只有当您对了解编译器的工作方式感兴趣时,这才有意义。作为该语言的常规用户,您不应该关心这些关系,并且绝对不要编写任何依赖于这些关系的程序。首先,您混淆了数组和指针。虽然它们在C中的行为非常相似,但它们不是一回事。在您的示例中,这非常容易,因为您将数组分配给指针以打印其地址,从而有效地强制转换它

这种区别的相关部分在于,当您通过以下方式定义数组时:

int a1[]={1,2,3,4,5};
a1
定义为整个阵列的实际大小(即-5整数)
a1
没有自己的地址,将其转换为指针实际上会给出其第一个元素的地址(即
(int*)a1==&a1[0]

现在谈谈你的实际问题。在堆栈上定义的局部变量的顺序没有被C定义。它可能会像您所期望的那样上升。它也可能下降。它也可能是随机的。如果编译器确定两个变量从未同时使用,它甚至可能会将两个变量分配给同一个地址。如果这不是一个一般性的理解问题,如果您试图通过理解订单来实现某些目标,我给您的最好建议是不要

至于实际的顺序:在大多数平台上,尤其是英特尔,堆栈向下增长。这意味着较低的地址被认为比较高的地址“更晚”。您的编译器非常合理地将数组按顺序放置(即向下增长)


以上所有内容均不适用于单个数组的元素顺序。在单个数组中,元素的顺序定义良好,并且必须按升序排列。在这一点上,标准没有给编译器任何回旋余地,您可以依赖它(尽管我不明白您为什么想要)。这与我上面所说的并不矛盾,因为单个数组的所有元素都是在堆栈上一起分配的,因此内部顺序除了我们分配给它们的顺序之外没有任何意义。

首先,您混淆了数组和指针。虽然它们在C中的行为非常相似,但它们不是一回事。在您的示例中,这非常容易,因为您将数组分配给指针以打印其地址,从而有效地强制转换它

这种区别的相关部分在于,当您通过以下方式定义数组时:

int a1[]={1,2,3,4,5};
a1
定义为整个阵列的实际大小(即-5整数)
a1
没有自己的地址,将其转换为指针实际上会给出其第一个元素的地址(即
(int*)a1==&a1[0]

现在谈谈你的实际问题。在堆栈上定义的局部变量的顺序没有被C定义。它可能会像您所期望的那样上升。它也可能下降。它也可能是随机的。如果编译器确定两个变量从未同时使用,它甚至可能会将两个变量分配给同一个地址。如果这不是一个普遍的理解问题,如果你试图通过理解来实现某件事