C指针(数组)内存分配(十六进制)
我在玩C语言的内存寻址,遇到了一个无法完全解释的情况 <>编辑:代码由C++编译器编译。(g++) 但对于第二个数组,我得到:C指针(数组)内存分配(十六进制),c,arrays,pointers,memory,C,Arrays,Pointers,Memory,我在玩C语言的内存寻址,遇到了一个无法完全解释的情况 编辑:代码由C++编译器编译。(g++) 但对于第二个数组,我得到: 0:0x7ffdaf876290 1:0x7ffdaf876294 (only 4 bits? or maybe they are bytes - but why the long addresses???) 有人能解释一下吗?(还有没有一个函数可以毫不费力地将十六进制转换为十进制?首先,数组是指针数组。每个元素都是一个指针,当您为指向的每个指针分配内存时,它与您为该数组
0:0x7ffdaf876290
1:0x7ffdaf876294 (only 4 bits? or maybe they are bytes - but why the long addresses???)
有人能解释一下吗?(还有没有一个函数可以毫不费力地将十六进制转换为十进制?首先,数组是指针数组。每个元素都是一个指针,当您为指向的每个指针分配内存时,它与您为该数组中的其他指针分配的内存完全无关。在本例中,它们实际上相隔32字节,但这只是一个纯粹的机会 在后一种情况下,您正在创建一个整数数组,这些整数在内存中聚在一起或“连续”。它们将是相邻的,因此打印它们的地址时所看到的模式是4个字节。显然,系统上的
int
是4字节宽(这仍然很常见)
“长地址”是由于您使用了动态分配:这将是虚拟内存中您的系统碰巧存放堆的区域。没什么好担心的
所以它没有什么“奇怪”的地方。Int for Array使用1字节 地址: -数组[0]=5000 然后 -数组[1]=5001 -数组[2]=5002 -数组[3]=5003 -数组[4]=5004 -数组[5]=5005 -数组[6]=5006 -数组[7]=5007 -数组[8]=5008 -数组[9]=5009 现在,您正在分配指针。 然后是指针的地址:
- *(数组[0])=5010
- *(数组[1])=5011
- *(数组[2])=5012
- *(数组[3])=5013
- *(数组[4])=5014
- *(数组[5])=5015
- *(数组[6])=5016
- *(数组[7])=5017
- *(数组[8])=5018
- *(数组[9])=5019
int arr[10];
它只定义了基址。
然后您将该基址提供给*起始地址:
int* start=arr;
因此,指针获取该地址。
显然,让我们:
地址:
- arr[0]=5020 然后:
- *(开始+0)=5020
- arr[0]=5020-5023
- arr[1]=5024-5028 等等
- 每当我们定义数组时,它只定义基址。 例: INTA[10]
- 无论何时定义指针,它也将只分配基址
- 区别仅在于分配,即数组为指针分配1字节,指针为指针分配4字节(GCC/Linux/32位编译器)
%p
打印内存地址,它们是字节而不是位。前两个相隔32字节,后两个相隔4字节。帕特里克·罗伯茨你的评论很有意义。但我得到的都是32字节的差异(也许这就是我的平台分配它们的方式)。是的,这就是每个人的观点。所有这些都依赖于平台,您不应该期望或依赖任何特定的行为,因为如果您安全、正确地编写程序,它永远不会直接影响您。您确定您没有混合使用阵列吗?据我所知,第一个是指针数组,第二个是整数数组。我没有说我需要它们在内存中是连续的(尽管它们是连续的,在第二种情况下,这会引起问题)-为什么整数之间只有4位(或者它们是字节,如果是,为什么?@SlowTrout:你说得对,我把它们翻过来了。但答案是一样的:它们是字节,这是因为int
s在你的系统上有4个字节宽。如果有人不明白我说的话。简单地理解,所有地址的分配都取决于何时调用它们来赋值。否则只定义了基址。在解释第一个数组时一定有错误,就像我解释的16位编译器一样。很抱歉,但分配过程是一样的。只有字节数不同。所以,请注意分配过程。抱歉,但嗯,为什么?Turbo C比C++更古老!!!它已经有二十多年的历史了,是为MS DOS设计的!!!!对你知道吗,我没有把这一点告诉你。。DOS是内存分配类似于FCFS的主要原因。。
int arr[10];
int* start=arr;