【问题标题】:Why is my Memory sometimes 4.5 bytes and some times 6 bytes?为什么我的内存有时是 4.5 字节,有时是 6 字节?
【发布时间】:2020-04-11 22:29:09
【问题描述】:

为什么我的 MacBook Pro 2015 型号酷睿 i5 的内存有时为 4.5 字节,有时为 6 字节?

我在 C 中运行了这段代码。

#include <stdio.h>
#include <string.h>

int main(){

char ch[] = "Hello World!";
char *p1 = "Hello World!";

printf("%p %s\n", &ch , ch);

printf("size of = %lu bytes\n", sizeof(&ch));

printf("%p %s\n", p1, p1);

printf("size of = %lu bytes\n", sizeof(p1));

return 0;
}

我的终端输出是

0x7ffee8f54a2b Hello World!
size of = 8 bytes
0x106cabf88 Hello World!
size of = 8 bytes

为什么我在第一种情况下得到一个 6 字节的内存地址,而在第二种情况下得到 4.5 个字节的内存地址?

【问题讨论】:

  • 在前面加上三个0s,得到一个6字节的地址。
  • 所有前导零都被删除。尝试使用 %p 的 %X 状态。
  • ch 位于栈上,p1 指向的字符串在文本部分。他们在记忆中相距甚远。
  • 如果您想知道指针的大小,请使用sizeof
  • @DevO %X 用于int%p 用于 void *。建议一个不匹配的说明符会导致麻烦。

标签: c memory memory-management


【解决方案1】:

在此声明中

printf("%p %s\n", &ch , ch);

输出变量ch的地址,自动存储时长声明如下

char ch[] = "Hello World!";

在此声明中

printf("%p %s\n", p1, p1);

输出存储在指针p1中的值,即字符串文字“Hello World!”的第一个字符的地址存储在静态内存(具有静态存储时长的内存)中。

所以你正在输出不同类型内存的地址。

在第二种情况下,地址的值小于第一种情况。尽管两个指针的大小相同,均为 8 字节,但不输出前导零。

【讨论】:

    【解决方案2】:

    为什么我在第一种情况下得到一个 6 字节的内存地址,而在第二种情况下得到 4.5 个字节的内存地址?

    "%p" 的格式取决于实现。 OP 的系统很简单,省略了前导零十六进制数字。

    内存地址(指针)都占用相同的大小:8 个字节(或者可能更多 - 但相同)。

    不同的内存区域@Barmar

    【讨论】:

      猜你喜欢
      • 2011-03-19
      • 1970-01-01
      • 2020-02-06
      • 1970-01-01
      • 1970-01-01
      • 2013-01-19
      • 2013-12-08
      • 2019-06-13
      • 1970-01-01
      相关资源
      最近更新 更多