在堆中, 当一个变量占多个字节的内存时,变量的指针指向的是高地址还是低地址?

已知

当一个变量占多个字节的内存时,变量的指针指向的是高地址还是低地址?在栈中指针指向的是最低地址的那个字节(大概知道是因为push的原因)

void main()
{
  int a=0x01020304;
  
  unsigned char* a1=(unsigned char*)(&a);
  unsigned char* a2=(a1+1);
  unsigned char* a3=(a1+2);
  unsigned char* a4=(a1+3);
  
  
  printf("a:%x\n",  a);
  printf("a1:%d\n", *a1);
  printf("a2:%d\n", *a2);
  printf("a3:%d\n", *a3);
  printf("a4:%d\n", *a4);
  
  return ;
}

输出结果:
image.png

提问

在堆中的实现不知道怎么写。

请教下:

  1. 当一个变量占多个字节的内存时,变量的指针指向的是高地址还是低地址?在堆中指针指向的是否也是最低地址的那个字节?
  2. 是否一个变量占多个字节都是从低到高?另外大小端有区别吗?
  3. 编译器一般对堆内存会怎么处理?
阅读 2.7k
1 个回答

我想你把内存的生长方向与操作逻辑搞混了,这是两件事,堆跟栈的生长方向不同,是指分配的方向不同。但是对于一个变量或者一段内存块来说,不管在哪里,操作逻辑是相同的,操作逻辑,不会因为栈区或堆区而搞差异化操作,没必要并且也不应该有差异。
大小端是关系到数据的存放顺序,a1~4的输出,小端是4321,大端是1234,跟你的问题没关系
申请堆内存可以用malloc或者new

#include <stdio.h>
#include <stdlib.h>

int main()
{
  int a=0x01020304;
  
  unsigned char* a1=(unsigned char*)(&a);
  unsigned char* a2=(a1+1);
  unsigned char* a3=(a1+2);
  unsigned char* a4=(a1+3);
  
  
  printf("a:%x\n",  a);
  printf("a1:%d\n", *a1);
  printf("a2:%d\n", *a2);
  printf("a3:%d\n", *a3);
  printf("a4:%d\n", *a4);
  
  unsigned int* b = (unsigned int*)malloc(sizeof(unsigned int));
  *b = 0x01020304;
  
  unsigned char* b1=(unsigned char*)b;
  unsigned char* b2=(b1+1);
  unsigned char* b3=(b1+2);
  unsigned char* b4=(b1+3);
  
  printf("b:%x\n",  *b);
  printf("b1:%d\n", *b1);
  printf("b2:%d\n", *b2);
  printf("b3:%d\n", *b3);
  printf("b4:%d\n", *b4);
  
  free(b);
  
  return 0;
}

输出:

a:1020304
a1:4
a2:3
a3:2
a4:1
b:1020304
b1:4
b2:3
b3:2
b4:1
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题