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

发布于 2022-09-12 02:12:33 字数 752 浏览 26 评论 0

已知

当一个变量占多个字节的内存时,变量的指针指向的是高地址还是低地址?在栈中指针指向的是最低地址的那个字节(大概知道是因为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. 编译器一般对堆内存会怎么处理?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

靖瑶 2022-09-19 02:12:33

我想你把内存的生长方向与操作逻辑搞混了,这是两件事,堆跟栈的生长方向不同,是指分配的方向不同。但是对于一个变量或者一段内存块来说,不管在哪里,操作逻辑是相同的,操作逻辑,不会因为栈区或堆区而搞差异化操作,没必要并且也不应该有差异。
大小端是关系到数据的存放顺序,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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文