Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C指针(数组)内存分配(十六进制)_C_Arrays_Pointers_Memory - Fatal编程技术网

C指针(数组)内存分配(十六进制)

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???) 有人能解释一下吗?(还有没有一个函数可以毫不费力地将十六进制转换为十进制?首先,数组是指针数组。每个元素都是一个指针,当您为指向的每个指针分配内存时,它与您为该数组

我在玩C语言的内存寻址,遇到了一个无法完全解释的情况

<>编辑:代码由C++编译器编译。(g++)

但对于第二个数组,我得到:

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
在这里,您可以很容易地看到数组[i]和*(数组[i])之间的差异总是10字节。 这是因为当调用任何数组时,只有它一次分配内存总大小。

第二组的地址: 已定义但未调用数组arr因此,在调用该arr之前,不会分配内存 这里,调用是为了定义它

现在,第一行说:

int arr[10];
它只定义了基址。 然后您将该基址提供给*起始地址:

int* start=arr;
因此,指针获取该地址。 显然,让我们: 地址:

  • arr[0]=5020 然后:
  • *(开始+0)=5020
因为它是一个指针(不是数组),所以需要4个字节。 同样,所有地址范围将为:

  • arr[0]=5020-5023
  • arr[1]=5024-5028 等等
分配说明:

  • 每当我们定义数组时,它只定义基址。 例:

    INTA[10]

将分配基址,即起始地址,即[0]的地址

  • 无论何时定义指针,它也将只分配基址

  • 区别仅在于分配,即数组为指针分配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;