c - 如何在 C 中完成自动数组的排序?

标签 c arrays pointers cygwin

假设我有三个数组 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+1b+1 之间的关系不做任何 promise 。编译器可以自由选择如何为 ab 分配内存。

通过检查ab 元素的地址值,可以判断编译器如何为数组分配内存。但只有当您有兴趣弄清楚编译器的工作原理时,才有兴趣。作为该语言的普通用户,您不应该关心这些关系,并且绝对不要编写任何依赖于这些关系的程序

关于c - 如何在 C 中完成自动数组的排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37873726/

相关文章:

pointers - 包含级联映射的结构的空括号初始化

c++ - 为什么断言宏仅用于调试构建

c - 带有 Cmake 的 arm-none-eabi-gcc 没有带有标志 -nostdlib 的入口点

java - 如何跳过某些部分读取文件并输入数据信息二维数组

c - 如何在运行时分配多维数组?

我可以创建一个函数,它接受一个指向数组的指针,该数组在每次调用时可能包含不同类型的数字吗?

c - 使用计数变量偏移指向指针的指针

c - 我试图使用 free() 释放结构中元素占用的内存,但它不起作用

javascript - 对象数组的对象。获取具有相同属性的所有值的长度

java - java 数组输出中的间距