加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何在C中“实现”数组?

发布时间:2020-12-16 10:37:52 所属栏目:百科 来源:网络整理
导读:数组尤其不是指针.可以肯定的是,两个左值似乎都包含(1维)虚拟内存中某个位置的(1维)坐标.但请考虑这个例子. #include stdlib.h#include stdio.hint main(){ char buffer0[4096]; char* buffer1 = malloc(4096); printf("lvalue %16p sizeof %lun",(void *)
数组尤其不是指针.可以肯定的是,两个左值似乎都包含(1维)虚拟内存中某个位置的(1维)坐标.但请考虑这个例子.

#include <stdlib.h>
#include <stdio.h>
int main(){
  char buffer0[4096];
  char* buffer1 = malloc(4096);
  printf("lvalue %16p  sizeof %lun",(void *) buffer0,sizeof(buffer0));
  printf("lvalue %16p  sizeof %lun",(void *) buffer1,sizeof(buffer1));
// Example output:  lvalue   0x7ffcb70e8620  sizeof 4096
// Example output:  lvalue         0x7a4420  sizeof 8
}

想到的实际差异是:

>数组知道它们有多大(以字节为单位)(并且,通过扩展,它们知道它们有多少元素);指针不会(但是malloc()必须知道指针有多大,知道在给定指针的情况下free()有多少……!)
>数组是“垃圾收集”(不需要释放它们);指针必须手动释放(如果它们拥有非常重要的内存量,即通过malloc())
>阵列“活”在堆栈中(高虚拟内存地址,至少在我的平台上);指针在堆中“活”(低虚拟内存地址)
>传递给函数时,数组会衰减为指针
>数组无法调整大小;指针可以

总的来说,数组似乎比指针更聪明(但功能更少)(他们知道它们有多大,它们有多少元素,并且它们具有自动内存管理).

问题

>数组如何“知道”它们有多大?这是如何实现的?
>一般来说,如何用C语言实现数组? (编译器是这样做的,还是内核?

解决方法

How do arrays “know” how big they are? How is this implemented?

数组不知道它们有多大 – 没有与数组关联的元数据来指示大小(或类型或其他任何内容).在转换期间,编译器知道数组有多大,并且当时处理依赖于该知识的任何事物(指针算法,操作大小等).一旦生成了机器代码,数组就只是笨拙的内存块 – 通过查看数组对象本身,无法在运行时确定数组的大小(除了可变长度数组之类的可变修改类型,sizeof操作是在翻译期间计算,而不是运行时).

In general,how are arrays implemented in the C language? (Does the compiler do this,or does the kernel?

数组只不过是相同类型的连续对象序列.为宣言

T arr[N]; // for any type T

你得到

+---+
arr: |   | arr[0]
     +---+
     |   | arr[1]
     +---+
     |   | arr[2]
     +---+
      ...
     +---+ 
     |   | arr[N-1]
     +---+

没有arr对象独立于数组元素本身,也没有任何元数据放在任何地方,无论是大小,起始地址,类型还是其他任何东西.

下标操作arr [i]定义为*(arr i) – 给定数组的起始地址,从该地址偏移i个元素(不是字节!)并取消引用结果.

你是正确的,数组不是指针 – 但是,除非它是sizeof或unary&的操作数.运算符,或者是用于初始化声明中的字符数组的字符串文字,数组类型的表达式将被转换(“衰减”)为指针类型的表达式,并且表达式的值将是第一个的地址数组的元素(同样,这都是在翻译期间完成的,而不是在运行时完成的).

因此,当您编写类似x = arr [i];的内容时,编译器会将表达式arr转换为指针值,因此下标操作可以正常工作.

相反,当您编写ap =& arr;时,编译器不会将arr转换为指针类型.结果仍然与第一个元素的地址相同,但类型不同 – 而不是T *,类型是T(*)[N],或“指向T的N元素数组的指针”.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读