首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么打印一个C数组会显示不连续的地址?

打印一个C数组会显示不连续的地址的原因是,数组在内存中是连续存储的,但在打印数组时,通常会使用循环遍历数组的每个元素并打印出来。在打印过程中,每次打印一个元素时,实际上是打印该元素的地址。由于数组是连续存储的,所以每个元素的地址是连续的,但是由于打印的过程是逐个打印元素,所以打印出来的地址是不连续的。

具体来说,当我们打印一个C数组时,通常会使用循环遍历数组的每个元素,并使用printf函数打印出每个元素的值和地址。在每次循环中,我们使用数组名加上索引来访问数组的元素,并使用取地址符号&获取该元素的地址。然后,我们将该地址传递给printf函数进行打印。

由于数组是连续存储的,每个元素的地址相差的字节数是相同的,这个字节数取决于数组元素的类型。例如,对于一个int类型的数组,每个元素的地址相差4个字节(32位系统)或8个字节(64位系统)。但是,由于我们是逐个打印数组元素,每次打印一个元素时,实际上是打印该元素的地址。因此,打印出来的地址是不连续的,而是按照数组元素的顺序逐个打印出来的。

总结起来,打印一个C数组会显示不连续的地址是因为我们是逐个打印数组元素的地址,而不是打印整个数组的地址范围。这并不意味着数组在内存中不是连续存储的,而是打印过程中的特性导致了地址的不连续显示。

腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C 语言】数组 ( 验证二维数组内存是线性 | 打印二维数组 | 以一维数组方式打印二维数组 | 打印二维数组值和地址 )

文章目录 一、验证二维数组内存是线性 1、打印二维数组 2、以一维数组方式打印二维数组 3、打印二维数组值和地址 二、完整代码示例 一、验证二维数组内存是线性 ---- 验证二维数组内存是线性...: 验证方法如下 ; ① 给二维数组赋值 , 然后 打印二维数组值 ; ② 使用 一维数组 方式打印二维数组 ; ③ 打印出二维数组 地址值 ; 1、打印二维数组 打印二维数组值...定义一个函数 , 函数接收一个 int* 形参指针 , 使用该指针访问二维数组元素个数 , 也可以成功访问 ; /** * @brief print_array2 使用一维数组方式打印二维数组值...array as one-dimensional array : 0 : 0 1 : 1 2 : 2 3 : 3 4 : 4 5 : 5 3、打印二维数组值和地址 打印二维数组元素和地址 , 其地址连续...; =/** * @brief print_array 打印二维数组值和地址 * @param array */ void print_array3(int array[][3]) {

2.4K20

C++单例模式为什么直接全部使用static,而是非要实例化一个对象?

开场 前段时间我在知乎回答了这样一个问题: 为什么C++单例模式不能直接全部使用 static变量和 static函数呢?如果全部使用 static的话,是不是也不会有多线程问题了?...那么为什么Meyers推荐是第一种呢? 原因是这解决了一类重要问题,那就是static变量初始化顺序问题。...C++只能保证在同一个文件中声明static变量初始化顺序与其变量声明顺序一致。但是不能保证不同文件中static变量初始化顺序。...在日志管理初始化时候,要通过配置文件单例对象来获取到某个配置项,实现日志打印。...,比如Monitor显示器类有开关状态,同时扩展了一个亮度成员。

1.1K20

初始java数组_初始化数组为0

变量地址是伪地址(安全性) 2.数组三种打印方式 1.常规遍历 2.创建变量接受 3.转换成字符串直接打印 1.直接遍历 public class TestDemo4 { public...第三种方法是Arrays.toString 把数组a转换成字符串,然后用s接受,然后直接打印 3.数组引用null 如果给数组定义null,那就是引用空意思,类似C语言NULL,都是指向无效地址...会发生空指针异常错误 首先需要了解是java数组存储对象是一片连续空间 但是二维数组元素是一维数组,也就是引用类型,因此他们空间自然就可以连续了,不妨自己画个图理解一下,连续也就不用硬性要去他们引用长度都一样...c语言数组连续空间,也有指针概念,所以可以数组名+1来跳过一个元素,因为数组名本质就是指针,但是java中没有指针概念,因此没有数组名+1这种操作 int[][] b = new int[][]{...{1, 2}, {1, 5, 6}, {6, 7, 8, 6}}; 它们每一行长度都不一样 回到刚刚问题,为什么空指针异常?

1.3K20

【Linux】基础IO——系统文件IO&fd&重定向&理解

3.细节 对于C语言文件操作存在一些细节在这个地方提出来: 1.以w方式单纯打开文件,c自动清空内部数据: 为什么自动清空内部数据,这是一个值得思考问题:这是因为O_TRUNC(这文件内容做清空...---- 四、文件描述符fd 1.引入 看到上面的结果,open返回值为什么是从3开始,那0,1,2跑哪里去了呢,而且还是连续小整数(说到连续,我们想到数组下标连续) 在C语言阶段,我们知道C...这也就很好结社了为什么打开文件返回值为3,打开文件内核描述struct file结构,把对应地址填充到struct file*fd_array[]数组下标中去,又因为0,1,2,默认会被占用,于是从...里面包含一个数组struct file fd_array[]指向对应文件数组,里面写着被打开文件地址,下标对应着填充文件对象。...这又引出了另外一个问题 4.close(1)问题 根据前面所说分配规则:我们可以知道,当我们关闭1时,此时1不在指向标准输出(显示器),不在向显示打印,当我们打开文件时候,系统会存在文件对象,然后在把文件地址

37120

C语言】带你玩转数组(全程高能)

是指用整型变量或表达式声明或定义数组,而不是说数组长度随时变化,变长数组在其生存期内长度同样是固定 我们来看看这一小段代码: 为什么编译不通过?...数组其实是顺序表,它其实在物理上和逻辑上是连续,怎么去理解呢⁉️ 我们可以通过创建一个数组,然后打印地址,看看代码及其运行图: 我们知道int是4个字节,也就是相邻元素之间差距4个字节4️⃣ 同时...下面,我们来看看二维数组是怎么存储 在内存中存储 像一维数组一样,这里我们尝试打印二维数组每个元素地址 从运行结果来看,通过结果我们可以分析到,其实二维数组在内存中也是连续存储。...好啦,到这里,我们先搁置一下这个问题,给大家先结束数组名是什么,通过介绍完数组名之后,你就会知道为什么会出现这种情况了 数组名 我们来看看数组地址和第一个元素地址有什么联系 我们可以得出一个结论...如果数组名是首元素地址,那怎么去理解这个呢? 结果是40,为什么呢?别急,凡事都有例外:数组名是数组首元素地址

48540

C语言:动态内存管理

这样就给代码书写增添了很多灵活性。 二、perror函数 我们大多都使用printf来打印一些信息,其它接口都比较少用。这里介绍一个被我们遗忘打印输出函数:perror函数。...2、如果你需要空间直接扩大后会影响别人空间,那这个时候编译器就会在内存中去寻找一块新合适大小连续空间,先是将原空间数据拷贝在新空间上,然后释放掉旧空间和旧地址,relloc返回新空间起始地址...,但是上述代码中,程序有一个while循环,所以程序一直结束,这样空间一直不被释放,空间泄露越来越严重!...方法2:利用返回值返回开辟空间起始地址,在函数栈帧销毁前利用寄存器将地址带回来,并用str接收 8.2 8.2 题目2 地址明明成功返回了,那为什么这个程序为什么打印是烫烫烫??...而且最后释放2次,1次是释放动态数组空间,1次是释放结构体空间。 动态数组同样可以完成这个功能,那为什么c99还要引入柔性数组呢?因为柔性数组有两个好处。

10310

CC++ 学习笔记四(指针、数组

即指针存储长度根据计算机不同,是一个固定大小 (32位4个字节、64位8个字节),数组存储是一块连续内存区域。...那为什么指针可以访问数组中元素? 这是因为数组标识符表示是该数组一个元素地址,当指针指向数组标识符时,便可以通过指针访问数组各个元素。...采用地址传递好处是形参不存在存储空间,编译系统不为形参分配内存,数组名或者指针便是一组连续空间地址。 例如下面例子输出size都为4。...] = "Hello"; fp(c); // fp size :4 fa(c); // fa size :4 } 数组与指针区别 数组和指针其实并不是一个相同概念,虽然在日常使用中...总结 1.指针变量是变量,存储内存地址变量。 3.数组存储是一段连续内存区域 4.数组标识符存储了,一段内存区域起始地址 5.数组作为参数传递时是地址传递,其他类型则为值传递

2.4K00

C语言进阶-动态内存管理柔性数组

目录 前言 为什么存在动态内存分配 动态内存函数介绍 malloc和free函数 malloc函数: free函数 calloc函数 realloc函数 常见动态内存错误 几个经典笔试题 C/C+...+程序内存开辟 柔性数组 柔性数组特点 柔性数组使用和优势 ---- 前言 ---- 本文章主要讲解: 动态内存管理使用即注意事项 有关于动态内存管理寄到笔试题讲解 柔性数组使用 为什么存在动态内存分配...很有必要 return 0; } 问:为真么free ptr后依旧需要将ptr置为空指针 举个特别的例子: 再问:如果忘记free动态申请空间地址怎么样 如果它在程序中一直没有使用,那么就会导致内存白白占用...栈区主要存放运行函数而分配局部变量、函数参数、返回数据、 返回地址等 堆区(heap):一般由程序员分配释放, 若程序员释放,程序结束时可能由OS回收 (分配方式类似于链表) 数据段(静态区)(static...)存放全局变量、静态数据(程序结束后由系统释放) 代码段:存放函数体(类成员函数和全局函数)二进制代码 柔性数组 概念: C99 中,结构中最后一个元素允许是未知大小数组,这就叫做『柔性数组

61020

逆向知识十三讲,汇编中数组表现形式,以及还原数组

我们可以看出,上面定义数组,数据是连续,其中每个数据类型大小都是int类型(类型也是一样) 汇编中识别数组:     1.地址连续     2.带有比例因子寻址   (lea  reg32,[xxx...Ary + sizeof(type) * n Ary+ (n*sizeof(type)) 在这里可能大家会有疑问,为什么esp + var_c数组地址,而不用+18h?...如有一个数组为:   int Ary[2][3] = {{1,2,3},{4,5,6}};   我要求4所在位置,   我们打印时候要输入 ary[1][0] 可以打印出4 那么我们可以通过手来计算出其位置...所以Debug下数组公式变成 数组地址 + sizeof(type[C]) * i + sizeof(type] * j Release下汇编 ?...上面说过,在Release下优化我们原始公式为 数组地址 + sizeof(type) * (C * i + j)形式 我们代入到汇编中查看. 1.eax 得出i值 2.edx得出数组地址

1.2K70

C语言指针5分钟教程

请注意这里需要显示转换。虽然C语言并不要求显示地转换,但这样增加代码可读性。接着我们对castptr指针取值,值为1。 第19行非常有意思,在这里打印未初始化指针和NULL指针。...值得注意是,未初始化指针是有内存地址,而且是一个垃圾地址。不知道这个内存地址 指向值是什么。这就是为什么不要对未初始化指针取值原因。...只有当你准备使用这个地址时有效。不要对NULL地址取值,否则会产生段错误。 指针和数组 C语言数组表示一段连续内存空间,用来存储多个特定类型对象。与之相反,指针用来存储单个内存地址。...数组和指针不是同一种结构因此不可以互相转换。而数组变量指向了数组一个元素内存地址一个数组变量是一个常量。即使指针变量指向同样地址或者一个不同数组,也不能把指针赋值给数组变量。...由于数组变量实际上是第一个元素地址,因此我们可以把这个地址赋值给指 针。这个赋值与int *ptr = &myarray[0]效果相同,显示地把数组一个元素地址赋值到了ptr引用。

1K50

C语言期末不挂科——指针初阶篇】

前言:   对于许多正在学习C语言小伙伴来说,指针可能让你非常头疼,很多人不知道如何控制指针变量,甚至都不敢用指针来写代码。...可能你还会有疑问:“为什么内存以字节为单位划分呢?”   其实经过前人计算与考量,发现一个字节给一个对应地址是比较合适。...我们发现第一个与第二个和第四个打印结果是相同,也就是说他们起始地址是相同,第一个和第四个就不用多说,两个是同一个变量取地址打印。   ...其实,这里没有对指针p进行初始化,他没有保存任何变量地址。这个指针也是一个局部变量,当局部变量初始化时候,内容是随机值。   ...3、指针相减到时元素个数,所以在连续内存空间下相减是比较有意义推荐两个毫不相关指针相减,因为几乎没什么意义。

7210

一文了解数组

计算机给每个内存单元分配一个地址,然后通过地址访问内存中数据。...低效插入和删除 数组插入和删除操作由于其内存数据连续性问题,这两个操作非常低效,那么为什么导致低效,有哪些改进方法呢?...同样在某些特定场景下,并不需要时刻追求数组数组连续性,可以将多次删除操作集中在一起进行操作。 如下图所示是一个长度为 10 数组,存储了 8 个元素,`现在是需要依次删除前三个元素,a,b,c。...因为循环结束条件问题,无限打印 "hello world",给定数组长度是 3, 但是循环结束条件是 i<=3 ,而 a[3] 其实就是访问越界了。...也就是说,a[3] 也是可以访问,但是定位到非数组所在内存上,而这个地址正好是存储变量 i 内存地址,也就是 a[3]=0 就相当于 i=0 ,最终导致代码无限循环。

47810

【数据结构】顺序表和链表详解&&顺序表和链表实现

但是在物理结构上并不一定是连续,线性表在物理上存储时,通常以数组和链式结构形式存储: 1.1 顺序表 1.1.1 概念及结构 顺序表是用一段物理地址连续存储单元依次存储数据元素线性结构 一般情况下采用数组存储...0开始 我们在学习数组时会有这个疑问: 数组元素下标为什么从0开始而不从1开始呢?...从1开始更符合我们日常习惯,比如生活中我们通常说第1个,而不是第0个 5.1 原因 对于数组元素访问在操作系统层其实就是对特定内存偏移量数据访问 换而言之即如果想要访问一个数组一个元素值那么首先就要计算它地址偏移量...} 因为 int每个元素占用4个字节,所以 数组中每个相邻元素内存地址都相差4, 那么每个元素地址就等于前一个元素地址 + 4 a[0] 内存地址 = a地址 + 0 * 4...(第一个元素地址计算结果 跟数组地址一样) a[1] 内存地址 = a地址 + 1 * 4 (下标是1,内存地址就就是首地址 偏移 4字节) a[2] 内存地址

7410

【深度揭秘】为什么很多语言数组下标是从0开始

但是你是否好奇想过,为什么呢?按照正常人思维都是从1开始吗? 所以,我们带着这个疑问往下看。...2、连续内存空间和相同数据类型。为啥数据访问一个数据效率非常高?那是因为数组定义将数组这种结构定好了规矩,线性连续给了我们快速随机访问机会。...假设有这么一个数组: java int[] a = new int[10]; 操作系统给分配了一块连续内存空间,假设为1000~1039,那么内存地址就是base_add = 1000 ?...数组越界啦 对于Java来说发生数据越界时候抛出异常,但是对于有些语言比如C语言发生数组越界时候并不会给你异常提示,比如下面这段代码: int i = 0; int arr[3] = {0};...,而a[3]地址刚好是存储i内存,所以当循环到a[3]时又赋值为0,相当于i=0;所以这个循环永远结束不了,“hello world”一直打印

98820

从Numpy中ascontiguousarray说起

概述 在使用Numpy时候,有时候遇到下面的错误: AttributeError: incompatible shape for a non-contiguous array 看报错字面意思,好像是连续数组...译文 所谓contiguous array,指的是数组在内存中存放地址也是连续(注意内存地址实际是一维),即访问数组一个元素,直接移动到内存中一个地址就可以。...从性能上来说,获取内存中相邻地址比不相邻地址速度要快很多(从RAM读取一个数值时候可以连着一起读一块地址数值,并且可以保存在Cache中)。这意味着对连续数组操作快很多。...补充 Numpy中,随机初始化数组默认都是C连续,经过不规则slice操作,则会改变连续性,可能变成既不是C连续,也不是Fortran连续。...: True ALIGNED : True WRITEBACKIFCOPY : False UPDATEIFCOPY : False 可以这样认为,ascontiguousarray函数将一个内存连续存储数组转换为内存连续存储数组

1.3K10

利用Numpy中ascontiguousarray可以是数组在内存上连续,加速计算

好像是连续数组shape兼容。...译文 所谓contiguous array,指的是数组在内存中存放地址也是连续(注意内存地址实际是一维),即访问数组一个元素,直接移动到内存中一个地址就可以。...这个数组看起来结构是这样:   在计算机内存里,数组arr实际存储是像下图所示:   这意味着arr是C连续C contiguous),因为在内存是行优先,即某个元素在内存中一个位置存储是它同行一个值...从性能上来说,获取内存中相邻地址比不相邻地址速度要快很多(从RAM读取一个数值时候可以连着一起读一块地址数值,并且可以保存在Cache中),这意味着对连续数组操作快很多。...补充 Numpy中,随机初始化数组默认都是C连续,经过不规则slice操作,则会改变连续性,可能变成既不是C连续,也不是Fortran连续

1.8K00

C语言内存地址基础

address of intvar + 1 = 0x7fff9575c05c 在第一个例子1-5行中,我们声明了一个字符变量,并打印输出该字符地址,然后打印了内存中位于该变量前后两个地址。...很多程序员第一次用C时,会将数组当做指针。那是不对。指针存储一个简单内存地址,而一个数组是一块存储多个值连续内存区域。...在我们 计算机中 int 是四个字节数组内存是连续,因此每个int型元素地址之间相差4。 在最后一行,我们打印数组大小,数组大小等于sizeof(type)乘上数组元素数量。...这里数组有5个int型变量,每一个占用4字节,因此整个数组大小为20字节。 结构体地址C语言中,结构体一般是连续内存区域,但也不一定是绝对连续区域。...1.struct变量指向struct首元素地址 2.不要去假设一个结构体成员相对于另外一个成员有多少内存偏移量,结构体成员之间可能有边界字节,或者编译器也可能将它们放在连续内存空间中。

2.5K80

C语言】动态内存管理

3 4、笔试题4 五、C/C++程序内存开辟 六、柔性数组 1、什么是柔性数组 2、柔性数组成员定义 3、柔性数组使用 4、柔性数组优势 一、为什么存在动态内存分配 C语言学习到现在,我们已经掌握和了解到内存开辟方式是通过数据类型来定义变量...这时 realloc 函数会在堆空间上另找一个合适大小连续空间来使用,这样函数返回一个内存地址; 所以我们在使用 realloc 函数时候不要直接将重新调整空间地址直接赋值给源空间地址,...在C99标准中,结构体中最后一个元素允许是未知大小数组,这就是柔性数组;柔性数组特点如下: 柔性数组只能在结构体中使用; 结构体中柔性数组成员前面必须至少有一个其他成员; sizeof 计算含柔性数组成员结构体大小时...; struct S { int n; int arr[0]; //柔性数组成员,把数组大小指定为0 }; 另一种方式是直接指定柔性数组大小,这种方式比较通用,在支持C99标准编译器下都不会报错...; struct S { int n; int arr[]; //柔性数组成员,直接指定数组大小 }; 3、柔性数组使用 我们在上面柔性数组特点里面已经提到,包含柔性数组成员结构体需要在堆区上开辟空间

1.6K00

深入理解Linux C语言内存管理

申请是由程序员自己来操作,在C中使用malloc函数,而C++中使用new运算符,但是堆申请过程比较复杂:当系统收到程序申请时,遍历记录空闲内存地址链表,以求寻找第一个空间大于所申请空间堆结点...碎片问题:对于堆来讲,频繁new/delete势必会造成内存空间连续,从而造成大量碎片,使程序效率降低。   ...堆是向高地址扩展数据结构,是连续内存区域。因为系统是用链表来存储空闲内存地址,且链表遍历方向是由低地址向高地址。由此可见,堆获得空间较灵活,也较大。...因此,能从栈获得空间较小。堆:堆是向高地址扩展数据结构,是连续内存区域。   这是由于系统是用链表来存储空闲内存地址,自然是连续,而链表遍历方向是由低地址向高地址。...这也就是对空指针访问导致crash原因,因为空指针地址是0。至于为什么预留不是一个字节而是几K,是因为内存是分页,至少要一页;另外几k空间还可以用来捕捉使用空指针情况。

2.7K10
领券