gpt4 book ai didi

c - int 指针数组中的指针地址

转载 作者:行者123 更新时间:2023-11-30 19:45:54 25 4
gpt4 key购买 nike

我对C语言很陌生,所以这个“问题”对我来说很困惑。

我想使用 int 指针(行)数组创建 2D 数组,该数组指向一个内存块中的 int 数组(列)。我做到了并且有效,但在检查了一些内容后我不确定为什么。

我使用 malloc 在堆中分配 48 个字节(2x4 数组)(我在 x86-64 机器上):

int **a;
a = (int **)malloc(sizeof(int*) * 2 + sizeof(int) * 2 * 4);

现在假设这是内存中的全部 48 个字节。我想要 2 行数组,所以我需要 2 个指向整数数组的指针 - a[0]、a[1]:

 ----------------------------------------------------------------
| a[0] | a[1] | |
----------------------------------------------------------------
^
|

我假设所有指针都是 8 个字节长,并且 a[2](箭头)的地址是我可以开始存储值(整数数组)的地方。所以我做到了...

int *addr = (int*)&a[2];
a[0] = addr;
addr += 4;
a[1] = addr;

这工作得很好,我可以轻松填充和打印二维数组。问题是,当我编写 int *addr = (int*)&a[2]; 时,我确信这将是 a[0] 的地址加上 2 * 8 字节,但事实并非如此't。我用这个简单的代码在另一个示例中检查了它:

int *p;
int **k;

p = (int*) malloc(30);
k = (int**) malloc(30);

printf("&p = %p %p %p\n", &p[0], &p[1], &p[2]);
printf("&k = %p %p %p\n", &k[0], &k[1], &k[2]);

输出:

&p = 0x14d8010 0x14d8014 0x14d8018 <-- ok (int = 4 bytes)
&k = 0x14d8040 0x14d8048 0x14d8050 <-- something wrong in my opinion (ptrs = 8 bytes)

我的问题是:为什么数组中指针的第三个地址是0x14d8050而不是0x14d8056。我认为这可能是因为 0x14d8056 不是整数的最佳地址,但为什么会这样以及为什么它只在处理指针数组时发生?我在 x86 机器上检查过这一点,指针具有“正常”值

&p = 0x8322008 0x832200c 0x8322010
&k = 0x8322030 0x8322034 0x8322038

我知道这对于某人来说可能是一个明显甚至愚蠢的问题,所以请至少分享一些包含有关此行​​为的信息的链接。谢谢。

最佳答案

前缀为0x的数字以十六进制十进制表示。

因此,预计为 0x14d8048 + 8 == 0x14d8050

关于c - int 指针数组中的指针地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25496620/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com